1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -vector-combine -S -mtriple=x86_64-- -mattr=SSE2 | FileCheck %s --check-prefixes=CHECK,SSE 3; RUN: opt < %s -vector-combine -S -mtriple=x86_64-- -mattr=AVX2 | FileCheck %s --check-prefixes=CHECK,AVX 4 5define <2 x i64> @add_constant(i64 %x) { 6; CHECK-LABEL: @add_constant( 7; CHECK-NEXT: [[BO_SCALAR:%.*]] = add i64 [[X:%.*]], 42 8; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 9; CHECK-NEXT: ret <2 x i64> [[BO]] 10; 11 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 12 %bo = add <2 x i64> %ins, <i64 42, i64 undef> 13 ret <2 x i64> %bo 14} 15 16define <2 x i64> @add_constant_not_undef_lane(i64 %x) { 17; CHECK-LABEL: @add_constant_not_undef_lane( 18; CHECK-NEXT: [[BO_SCALAR:%.*]] = add i64 [[X:%.*]], 42 19; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 20; CHECK-NEXT: ret <2 x i64> [[BO]] 21; 22 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 23 %bo = add <2 x i64> %ins, <i64 42, i64 -42> 24 ret <2 x i64> %bo 25} 26 27define <2 x i64> @add_constant_load(i64* %p) { 28; CHECK-LABEL: @add_constant_load( 29; CHECK-NEXT: [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4 30; CHECK-NEXT: [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0 31; CHECK-NEXT: [[BO:%.*]] = add <2 x i64> [[INS]], <i64 42, i64 -42> 32; CHECK-NEXT: ret <2 x i64> [[BO]] 33; 34 %ld = load i64, i64* %p 35 %ins = insertelement <2 x i64> undef, i64 %ld, i32 0 36 %bo = add <2 x i64> %ins, <i64 42, i64 -42> 37 ret <2 x i64> %bo 38} 39 40; IR flags are not required, but they should propagate. 41 42define <4 x i32> @sub_constant_op0(i32 %x) { 43; CHECK-LABEL: @sub_constant_op0( 44; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw nsw i32 -42, [[X:%.*]] 45; CHECK-NEXT: [[BO:%.*]] = insertelement <4 x i32> undef, i32 [[BO_SCALAR]], i64 1 46; CHECK-NEXT: ret <4 x i32> [[BO]] 47; 48 %ins = insertelement <4 x i32> undef, i32 %x, i32 1 49 %bo = sub nsw nuw <4 x i32> <i32 undef, i32 -42, i32 undef, i32 undef>, %ins 50 ret <4 x i32> %bo 51} 52 53define <4 x i32> @sub_constant_op0_not_undef_lane(i32 %x) { 54; CHECK-LABEL: @sub_constant_op0_not_undef_lane( 55; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw i32 42, [[X:%.*]] 56; CHECK-NEXT: [[BO:%.*]] = insertelement <4 x i32> undef, i32 [[BO_SCALAR]], i64 1 57; CHECK-NEXT: ret <4 x i32> [[BO]] 58; 59 %ins = insertelement <4 x i32> undef, i32 %x, i32 1 60 %bo = sub nuw <4 x i32> <i32 1, i32 42, i32 42, i32 -42>, %ins 61 ret <4 x i32> %bo 62} 63 64define <8 x i16> @sub_constant_op1(i16 %x) { 65; CHECK-LABEL: @sub_constant_op1( 66; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw i16 [[X:%.*]], 42 67; CHECK-NEXT: [[BO:%.*]] = insertelement <8 x i16> undef, i16 [[BO_SCALAR]], i64 0 68; CHECK-NEXT: ret <8 x i16> [[BO]] 69; 70 %ins = insertelement <8 x i16> undef, i16 %x, i32 0 71 %bo = sub nuw <8 x i16> %ins, <i16 42, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef> 72 ret <8 x i16> %bo 73} 74 75define <8 x i16> @sub_constant_op1_not_undef_lane(i16 %x) { 76; CHECK-LABEL: @sub_constant_op1_not_undef_lane( 77; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw i16 [[X:%.*]], 42 78; CHECK-NEXT: [[BO:%.*]] = insertelement <8 x i16> undef, i16 [[BO_SCALAR]], i64 0 79; CHECK-NEXT: ret <8 x i16> [[BO]] 80; 81 %ins = insertelement <8 x i16> undef, i16 %x, i32 0 82 %bo = sub nuw <8 x i16> %ins, <i16 42, i16 -42, i16 0, i16 1, i16 -2, i16 3, i16 -4, i16 5> 83 ret <8 x i16> %bo 84} 85 86define <16 x i8> @mul_constant(i8 %x) { 87; CHECK-LABEL: @mul_constant( 88; CHECK-NEXT: [[BO_SCALAR:%.*]] = mul i8 [[X:%.*]], -42 89; CHECK-NEXT: [[BO:%.*]] = insertelement <16 x i8> <i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 [[BO_SCALAR]], i64 2 90; CHECK-NEXT: ret <16 x i8> [[BO]] 91; 92 %ins = insertelement <16 x i8> undef, i8 %x, i32 2 93 %bo = mul <16 x i8> %ins, <i8 undef, i8 undef, i8 -42, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef> 94 ret <16 x i8> %bo 95} 96 97define <3 x i64> @mul_constant_not_undef_lane(i64 %x) { 98; CHECK-LABEL: @mul_constant_not_undef_lane( 99; CHECK-NEXT: [[BO_SCALAR:%.*]] = mul i64 [[X:%.*]], -42 100; CHECK-NEXT: [[BO:%.*]] = insertelement <3 x i64> <i64 0, i64 undef, i64 0>, i64 [[BO_SCALAR]], i64 2 101; CHECK-NEXT: ret <3 x i64> [[BO]] 102; 103 %ins = insertelement <3 x i64> undef, i64 %x, i32 2 104 %bo = mul <3 x i64> %ins, <i64 42, i64 undef, i64 -42> 105 ret <3 x i64> %bo 106} 107 108define <16 x i8> @mul_constant_multiuse(i8 %a0, <16 x i8> %a1) { 109; SSE-LABEL: @mul_constant_multiuse( 110; SSE-NEXT: [[INS:%.*]] = insertelement <16 x i8> <i8 undef, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, i8 [[A0:%.*]], i32 0 111; SSE-NEXT: [[MUL:%.*]] = mul <16 x i8> [[INS]], <i8 3, i8 7, i8 9, i8 11, i8 13, i8 15, i8 17, i8 19, i8 21, i8 23, i8 25, i8 27, i8 29, i8 31, i8 33, i8 35> 112; SSE-NEXT: [[AND:%.*]] = and <16 x i8> [[INS]], [[A1:%.*]] 113; SSE-NEXT: [[XOR:%.*]] = xor <16 x i8> [[AND]], [[MUL]] 114; SSE-NEXT: ret <16 x i8> [[XOR]] 115; 116; AVX-LABEL: @mul_constant_multiuse( 117; AVX-NEXT: [[INS:%.*]] = insertelement <16 x i8> <i8 undef, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, i8 [[A0:%.*]], i32 0 118; AVX-NEXT: [[MUL_SCALAR:%.*]] = mul i8 [[A0]], 3 119; AVX-NEXT: [[MUL:%.*]] = insertelement <16 x i8> <i8 undef, i8 7, i8 18, i8 33, i8 52, i8 75, i8 102, i8 -123, i8 -88, i8 -49, i8 -6, i8 41, i8 92, i8 -109, i8 -50, i8 13>, i8 [[MUL_SCALAR]], i64 0 120; AVX-NEXT: [[AND:%.*]] = and <16 x i8> [[INS]], [[A1:%.*]] 121; AVX-NEXT: [[XOR:%.*]] = xor <16 x i8> [[AND]], [[MUL]] 122; AVX-NEXT: ret <16 x i8> [[XOR]] 123; 124 %ins = insertelement <16 x i8> <i8 undef, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>, i8 %a0, i32 0 125 %mul = mul <16 x i8> %ins, <i8 3, i8 7, i8 9, i8 11, i8 13, i8 15, i8 17, i8 19, i8 21, i8 23, i8 25, i8 27, i8 29, i8 31, i8 33, i8 35> 126 %and = and <16 x i8> %ins, %a1 127 %xor = xor <16 x i8> %and, %mul 128 ret <16 x i8> %xor 129} 130 131define <2 x i64> @shl_constant_op0(i64 %x) { 132; CHECK-LABEL: @shl_constant_op0( 133; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl i64 2, [[X:%.*]] 134; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 135; CHECK-NEXT: ret <2 x i64> [[BO]] 136; 137 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 138 %bo = shl <2 x i64> <i64 undef, i64 2>, %ins 139 ret <2 x i64> %bo 140} 141 142define <2 x i64> @shl_constant_op0_not_undef_lane(i64 %x) { 143; CHECK-LABEL: @shl_constant_op0_not_undef_lane( 144; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl i64 2, [[X:%.*]] 145; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 146; CHECK-NEXT: ret <2 x i64> [[BO]] 147; 148 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 149 %bo = shl <2 x i64> <i64 5, i64 2>, %ins 150 ret <2 x i64> %bo 151} 152 153define <2 x i64> @shl_constant_op0_load(i64* %p) { 154; CHECK-LABEL: @shl_constant_op0_load( 155; CHECK-NEXT: [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4 156; CHECK-NEXT: [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 1 157; CHECK-NEXT: [[BO:%.*]] = shl <2 x i64> <i64 undef, i64 2>, [[INS]] 158; CHECK-NEXT: ret <2 x i64> [[BO]] 159; 160 %ld = load i64, i64* %p 161 %ins = insertelement <2 x i64> undef, i64 %ld, i32 1 162 %bo = shl <2 x i64> <i64 undef, i64 2>, %ins 163 ret <2 x i64> %bo 164} 165 166define <4 x i32> @shl_constant_op0_multiuse(i32 %a0, <4 x i32> %a1) { 167; SSE-LABEL: @shl_constant_op0_multiuse( 168; SSE-NEXT: [[INS:%.*]] = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 [[A0:%.*]], i32 0 169; SSE-NEXT: [[MUL_SCALAR:%.*]] = shl i32 [[A0]], 3 170; SSE-NEXT: [[MUL:%.*]] = insertelement <4 x i32> <i32 0, i32 16, i32 64, i32 192>, i32 [[MUL_SCALAR]], i64 0 171; SSE-NEXT: [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]] 172; SSE-NEXT: [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]] 173; SSE-NEXT: ret <4 x i32> [[XOR]] 174; 175; AVX-LABEL: @shl_constant_op0_multiuse( 176; AVX-NEXT: [[INS:%.*]] = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 [[A0:%.*]], i32 0 177; AVX-NEXT: [[MUL:%.*]] = shl <4 x i32> [[INS]], <i32 3, i32 4, i32 5, i32 6> 178; AVX-NEXT: [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]] 179; AVX-NEXT: [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]] 180; AVX-NEXT: ret <4 x i32> [[XOR]] 181; 182 %ins = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 %a0, i32 0 183 %mul = shl <4 x i32> %ins, <i32 3, i32 4, i32 5, i32 6> 184 %and = and <4 x i32> %ins, %a1 185 %xor = xor <4 x i32> %and, %mul 186 ret <4 x i32> %xor 187} 188 189define <2 x i64> @shl_constant_op1(i64 %x) { 190; CHECK-LABEL: @shl_constant_op1( 191; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5 192; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0 193; CHECK-NEXT: ret <2 x i64> [[BO]] 194; 195 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 196 %bo = shl nuw <2 x i64> %ins, <i64 5, i64 undef> 197 ret <2 x i64> %bo 198} 199 200define <2 x i64> @shl_constant_op1_not_undef_lane(i64 %x) { 201; CHECK-LABEL: @shl_constant_op1_not_undef_lane( 202; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5 203; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 204; CHECK-NEXT: ret <2 x i64> [[BO]] 205; 206 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 207 %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2> 208 ret <2 x i64> %bo 209} 210 211define <2 x i64> @shl_constant_op1_load(i64* %p) { 212; CHECK-LABEL: @shl_constant_op1_load( 213; CHECK-NEXT: [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4 214; CHECK-NEXT: [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0 215; CHECK-NEXT: [[BO:%.*]] = shl nuw <2 x i64> [[INS]], <i64 5, i64 2> 216; CHECK-NEXT: ret <2 x i64> [[BO]] 217; 218 %ld = load i64, i64* %p 219 %ins = insertelement <2 x i64> undef, i64 %ld, i32 0 220 %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2> 221 ret <2 x i64> %bo 222} 223 224define <2 x i64> @ashr_constant_op0(i64 %x) { 225; CHECK-LABEL: @ashr_constant_op0( 226; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]] 227; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 228; CHECK-NEXT: ret <2 x i64> [[BO]] 229; 230 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 231 %bo = ashr exact <2 x i64> <i64 undef, i64 2>, %ins 232 ret <2 x i64> %bo 233} 234 235define <2 x i64> @ashr_constant_op0_not_undef_lane(i64 %x) { 236; CHECK-LABEL: @ashr_constant_op0_not_undef_lane( 237; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]] 238; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 239; CHECK-NEXT: ret <2 x i64> [[BO]] 240; 241 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 242 %bo = ashr exact <2 x i64> <i64 5, i64 2>, %ins 243 ret <2 x i64> %bo 244} 245 246define <2 x i64> @ashr_constant_op1(i64 %x) { 247; CHECK-LABEL: @ashr_constant_op1( 248; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5 249; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0 250; CHECK-NEXT: ret <2 x i64> [[BO]] 251; 252 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 253 %bo = ashr <2 x i64> %ins, <i64 5, i64 undef> 254 ret <2 x i64> %bo 255} 256 257define <2 x i64> @ashr_constant_op1_not_undef_lane(i64 %x) { 258; CHECK-LABEL: @ashr_constant_op1_not_undef_lane( 259; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5 260; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 261; CHECK-NEXT: ret <2 x i64> [[BO]] 262; 263 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 264 %bo = ashr <2 x i64> %ins, <i64 5, i64 2> 265 ret <2 x i64> %bo 266} 267 268define <2 x i64> @lshr_constant_op0(i64 %x) { 269; CHECK-LABEL: @lshr_constant_op0( 270; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]] 271; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 272; CHECK-NEXT: ret <2 x i64> [[BO]] 273; 274 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 275 %bo = lshr <2 x i64> <i64 5, i64 undef>, %ins 276 ret <2 x i64> %bo 277} 278 279define <2 x i64> @lshr_constant_op0_not_undef_lane(i64 %x) { 280; CHECK-LABEL: @lshr_constant_op0_not_undef_lane( 281; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]] 282; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 283; CHECK-NEXT: ret <2 x i64> [[BO]] 284; 285 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 286 %bo = lshr <2 x i64> <i64 5, i64 2>, %ins 287 ret <2 x i64> %bo 288} 289 290define <2 x i64> @lshr_constant_op1(i64 %x) { 291; CHECK-LABEL: @lshr_constant_op1( 292; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2 293; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 294; CHECK-NEXT: ret <2 x i64> [[BO]] 295; 296 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 297 %bo = lshr exact <2 x i64> %ins, <i64 undef, i64 2> 298 ret <2 x i64> %bo 299} 300 301define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) { 302; CHECK-LABEL: @lshr_constant_op1_not_undef_lane( 303; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2 304; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 305; CHECK-NEXT: ret <2 x i64> [[BO]] 306; 307 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 308 %bo = lshr exact <2 x i64> %ins, <i64 5, i64 2> 309 ret <2 x i64> %bo 310} 311 312define <2 x i64> @urem_constant_op0(i64 %x) { 313; CHECK-LABEL: @urem_constant_op0( 314; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] 315; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 316; CHECK-NEXT: ret <2 x i64> [[BO]] 317; 318 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 319 %bo = urem <2 x i64> <i64 5, i64 undef>, %ins 320 ret <2 x i64> %bo 321} 322 323define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) { 324; CHECK-LABEL: @urem_constant_op0_not_undef_lane( 325; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] 326; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 327; CHECK-NEXT: ret <2 x i64> [[BO]] 328; 329 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 330 %bo = urem <2 x i64> <i64 5, i64 2>, %ins 331 ret <2 x i64> %bo 332} 333 334define <2 x i64> @urem_constant_op1(i64 %x) { 335; CHECK-LABEL: @urem_constant_op1( 336; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2 337; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 338; CHECK-NEXT: ret <2 x i64> [[BO]] 339; 340 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 341 %bo = urem <2 x i64> %ins, <i64 undef, i64 2> 342 ret <2 x i64> %bo 343} 344 345define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) { 346; CHECK-LABEL: @urem_constant_op1_not_undef_lane( 347; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2 348; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 349; CHECK-NEXT: ret <2 x i64> [[BO]] 350; 351 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 352 %bo = urem <2 x i64> %ins, <i64 5, i64 2> 353 ret <2 x i64> %bo 354} 355 356define <2 x i64> @srem_constant_op0(i64 %x) { 357; CHECK-LABEL: @srem_constant_op0( 358; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] 359; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 360; CHECK-NEXT: ret <2 x i64> [[BO]] 361; 362 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 363 %bo = srem <2 x i64> <i64 5, i64 undef>, %ins 364 ret <2 x i64> %bo 365} 366 367define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) { 368; CHECK-LABEL: @srem_constant_op0_not_undef_lane( 369; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] 370; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 371; CHECK-NEXT: ret <2 x i64> [[BO]] 372; 373 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 374 %bo = srem <2 x i64> <i64 5, i64 2>, %ins 375 ret <2 x i64> %bo 376} 377 378define <2 x i64> @srem_constant_op1(i64 %x) { 379; CHECK-LABEL: @srem_constant_op1( 380; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2 381; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 382; CHECK-NEXT: ret <2 x i64> [[BO]] 383; 384 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 385 %bo = srem <2 x i64> %ins, <i64 undef, i64 2> 386 ret <2 x i64> %bo 387} 388 389define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) { 390; CHECK-LABEL: @srem_constant_op1_not_undef_lane( 391; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2 392; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 393; CHECK-NEXT: ret <2 x i64> [[BO]] 394; 395 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 396 %bo = srem <2 x i64> %ins, <i64 5, i64 2> 397 ret <2 x i64> %bo 398} 399 400define <2 x i64> @udiv_constant_op0(i64 %x) { 401; CHECK-LABEL: @udiv_constant_op0( 402; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] 403; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 404; CHECK-NEXT: ret <2 x i64> [[BO]] 405; 406 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 407 %bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins 408 ret <2 x i64> %bo 409} 410 411define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) { 412; CHECK-LABEL: @udiv_constant_op0_not_undef_lane( 413; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] 414; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 415; CHECK-NEXT: ret <2 x i64> [[BO]] 416; 417 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 418 %bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins 419 ret <2 x i64> %bo 420} 421 422define <2 x i64> @udiv_constant_op1(i64 %x) { 423; CHECK-LABEL: @udiv_constant_op1( 424; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2 425; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 426; CHECK-NEXT: ret <2 x i64> [[BO]] 427; 428 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 429 %bo = udiv <2 x i64> %ins, <i64 undef, i64 2> 430 ret <2 x i64> %bo 431} 432 433define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) { 434; CHECK-LABEL: @udiv_constant_op1_not_undef_lane( 435; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2 436; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 437; CHECK-NEXT: ret <2 x i64> [[BO]] 438; 439 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 440 %bo = udiv <2 x i64> %ins, <i64 5, i64 2> 441 ret <2 x i64> %bo 442} 443 444define <2 x i64> @sdiv_constant_op0(i64 %x) { 445; CHECK-LABEL: @sdiv_constant_op0( 446; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] 447; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 448; CHECK-NEXT: ret <2 x i64> [[BO]] 449; 450 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 451 %bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins 452 ret <2 x i64> %bo 453} 454 455define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) { 456; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane( 457; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] 458; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 459; CHECK-NEXT: ret <2 x i64> [[BO]] 460; 461 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 462 %bo = sdiv <2 x i64> <i64 5, i64 2>, %ins 463 ret <2 x i64> %bo 464} 465 466define <2 x i64> @sdiv_constant_op1(i64 %x) { 467; CHECK-LABEL: @sdiv_constant_op1( 468; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2 469; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 470; CHECK-NEXT: ret <2 x i64> [[BO]] 471; 472 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 473 %bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2> 474 ret <2 x i64> %bo 475} 476 477define <2 x i64> @sdiv_constant_op1_not_undef_lane(i64 %x) { 478; CHECK-LABEL: @sdiv_constant_op1_not_undef_lane( 479; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2 480; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 481; CHECK-NEXT: ret <2 x i64> [[BO]] 482; 483 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 484 %bo = sdiv exact <2 x i64> %ins, <i64 5, i64 2> 485 ret <2 x i64> %bo 486} 487 488define <2 x i64> @and_constant(i64 %x) { 489; CHECK-LABEL: @and_constant( 490; CHECK-NEXT: [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42 491; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 undef>, i64 [[BO_SCALAR]], i64 0 492; CHECK-NEXT: ret <2 x i64> [[BO]] 493; 494 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 495 %bo = and <2 x i64> %ins, <i64 42, i64 undef> 496 ret <2 x i64> %bo 497} 498 499define <2 x i64> @and_constant_not_undef_lane(i64 %x) { 500; CHECK-LABEL: @and_constant_not_undef_lane( 501; CHECK-NEXT: [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42 502; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 503; CHECK-NEXT: ret <2 x i64> [[BO]] 504; 505 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 506 %bo = and <2 x i64> %ins, <i64 42, i64 -42> 507 ret <2 x i64> %bo 508} 509 510define <2 x i64> @or_constant(i64 %x) { 511; CHECK-LABEL: @or_constant( 512; CHECK-NEXT: [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42 513; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 -1>, i64 [[BO_SCALAR]], i64 1 514; CHECK-NEXT: ret <2 x i64> [[BO]] 515; 516 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 517 %bo = or <2 x i64> %ins, <i64 undef, i64 -42> 518 ret <2 x i64> %bo 519} 520 521define <2 x i64> @or_constant_not_undef_lane(i64 %x) { 522; CHECK-LABEL: @or_constant_not_undef_lane( 523; CHECK-NEXT: [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42 524; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 -1, i64 -1>, i64 [[BO_SCALAR]], i64 1 525; CHECK-NEXT: ret <2 x i64> [[BO]] 526; 527 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 528 %bo = or <2 x i64> %ins, <i64 42, i64 -42> 529 ret <2 x i64> %bo 530} 531 532define <2 x i64> @xor_constant(i64 %x) { 533; CHECK-LABEL: @xor_constant( 534; CHECK-NEXT: [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42 535; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 0>, i64 [[BO_SCALAR]], i64 0 536; CHECK-NEXT: ret <2 x i64> [[BO]] 537; 538 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 539 %bo = xor <2 x i64> %ins, <i64 42, i64 undef> 540 ret <2 x i64> %bo 541} 542 543define <2 x i64> @xor_constant_not_undef_lane(i64 %x) { 544; CHECK-LABEL: @xor_constant_not_undef_lane( 545; CHECK-NEXT: [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42 546; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 547; CHECK-NEXT: ret <2 x i64> [[BO]] 548; 549 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 550 %bo = xor <2 x i64> %ins, <i64 42, i64 -42> 551 ret <2 x i64> %bo 552} 553 554define <2 x double> @fadd_constant(double %x) { 555; CHECK-LABEL: @fadd_constant( 556; CHECK-NEXT: [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], 4.200000e+01 557; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 558; CHECK-NEXT: ret <2 x double> [[BO]] 559; 560 %ins = insertelement <2 x double> undef, double %x, i32 0 561 %bo = fadd <2 x double> %ins, <double 42.0, double undef> 562 ret <2 x double> %bo 563} 564 565define <2 x double> @fadd_constant_not_undef_lane(double %x) { 566; CHECK-LABEL: @fadd_constant_not_undef_lane( 567; CHECK-NEXT: [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], -4.200000e+01 568; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 569; CHECK-NEXT: ret <2 x double> [[BO]] 570; 571 %ins = insertelement <2 x double> undef, double %x, i32 1 572 %bo = fadd <2 x double> %ins, <double 42.0, double -42.0> 573 ret <2 x double> %bo 574} 575 576define <2 x double> @fsub_constant_op0(double %x) { 577; CHECK-LABEL: @fsub_constant_op0( 578; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub fast double 4.200000e+01, [[X:%.*]] 579; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 580; CHECK-NEXT: ret <2 x double> [[BO]] 581; 582 %ins = insertelement <2 x double> undef, double %x, i32 0 583 %bo = fsub fast <2 x double> <double 42.0, double undef>, %ins 584 ret <2 x double> %bo 585} 586 587define <2 x double> @fsub_constant_op0_not_undef_lane(double %x) { 588; CHECK-LABEL: @fsub_constant_op0_not_undef_lane( 589; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub nsz double -4.200000e+01, [[X:%.*]] 590; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 591; CHECK-NEXT: ret <2 x double> [[BO]] 592; 593 %ins = insertelement <2 x double> undef, double %x, i32 1 594 %bo = fsub nsz <2 x double> <double 42.0, double -42.0>, %ins 595 ret <2 x double> %bo 596} 597 598define <2 x double> @fsub_constant_op1(double %x) { 599; CHECK-LABEL: @fsub_constant_op1( 600; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01 601; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 602; CHECK-NEXT: ret <2 x double> [[BO]] 603; 604 %ins = insertelement <2 x double> undef, double %x, i32 1 605 %bo = fsub <2 x double> %ins, <double undef, double 42.0> 606 ret <2 x double> %bo 607} 608 609define <2 x double> @fsub_constant_op1_not_undef_lane(double %x) { 610; CHECK-LABEL: @fsub_constant_op1_not_undef_lane( 611; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01 612; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0 613; CHECK-NEXT: ret <2 x double> [[BO]] 614; 615 %ins = insertelement <2 x double> undef, double %x, i32 0 616 %bo = fsub <2 x double> %ins, <double 42.0, double -42.0> 617 ret <2 x double> %bo 618} 619 620define <2 x double> @fmul_constant(double %x) { 621; CHECK-LABEL: @fmul_constant( 622; CHECK-NEXT: [[BO_SCALAR:%.*]] = fmul reassoc double [[X:%.*]], 4.200000e+01 623; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 624; CHECK-NEXT: ret <2 x double> [[BO]] 625; 626 %ins = insertelement <2 x double> undef, double %x, i32 0 627 %bo = fmul reassoc <2 x double> %ins, <double 42.0, double undef> 628 ret <2 x double> %bo 629} 630 631define <2 x double> @fmul_constant_not_undef_lane(double %x) { 632; CHECK-LABEL: @fmul_constant_not_undef_lane( 633; CHECK-NEXT: [[BO_SCALAR:%.*]] = fmul double [[X:%.*]], -4.200000e+01 634; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 635; CHECK-NEXT: ret <2 x double> [[BO]] 636; 637 %ins = insertelement <2 x double> undef, double %x, i32 1 638 %bo = fmul <2 x double> %ins, <double 42.0, double -42.0> 639 ret <2 x double> %bo 640} 641 642define <2 x double> @fdiv_constant_op0(double %x) { 643; CHECK-LABEL: @fdiv_constant_op0( 644; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv nnan double 4.200000e+01, [[X:%.*]] 645; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 646; CHECK-NEXT: ret <2 x double> [[BO]] 647; 648 %ins = insertelement <2 x double> undef, double %x, i32 1 649 %bo = fdiv nnan <2 x double> <double undef, double 42.0>, %ins 650 ret <2 x double> %bo 651} 652 653define <2 x double> @fdiv_constant_op0_not_undef_lane(double %x) { 654; CHECK-LABEL: @fdiv_constant_op0_not_undef_lane( 655; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv ninf double 4.200000e+01, [[X:%.*]] 656; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0 657; CHECK-NEXT: ret <2 x double> [[BO]] 658; 659 %ins = insertelement <2 x double> undef, double %x, i32 0 660 %bo = fdiv ninf <2 x double> <double 42.0, double -42.0>, %ins 661 ret <2 x double> %bo 662} 663 664define <2 x double> @fdiv_constant_op1(double %x) { 665; CHECK-LABEL: @fdiv_constant_op1( 666; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01 667; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 668; CHECK-NEXT: ret <2 x double> [[BO]] 669; 670 %ins = insertelement <2 x double> undef, double %x, i32 0 671 %bo = fdiv <2 x double> %ins, <double 42.0, double undef> 672 ret <2 x double> %bo 673} 674 675define <2 x double> @fdiv_constant_op1_not_undef_lane(double %x) { 676; CHECK-LABEL: @fdiv_constant_op1_not_undef_lane( 677; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01 678; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0 679; CHECK-NEXT: ret <2 x double> [[BO]] 680; 681 %ins = insertelement <2 x double> undef, double %x, i32 0 682 %bo = fdiv <2 x double> %ins, <double 42.0, double -42.0> 683 ret <2 x double> %bo 684} 685 686define <2 x double> @frem_constant_op0(double %x) { 687; CHECK-LABEL: @frem_constant_op0( 688; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem fast double 4.200000e+01, [[X:%.*]] 689; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 690; CHECK-NEXT: ret <2 x double> [[BO]] 691; 692 %ins = insertelement <2 x double> undef, double %x, i32 0 693 %bo = frem fast <2 x double> <double 42.0, double undef>, %ins 694 ret <2 x double> %bo 695} 696 697define <2 x double> @frem_constant_op0_not_undef_lane(double %x) { 698; CHECK-LABEL: @frem_constant_op0_not_undef_lane( 699; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem double -4.200000e+01, [[X:%.*]] 700; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 701; CHECK-NEXT: ret <2 x double> [[BO]] 702; 703 %ins = insertelement <2 x double> undef, double %x, i32 1 704 %bo = frem <2 x double> <double 42.0, double -42.0>, %ins 705 ret <2 x double> %bo 706} 707 708define <2 x double> @frem_constant_op1(double %x) { 709; CHECK-LABEL: @frem_constant_op1( 710; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem ninf double [[X:%.*]], 4.200000e+01 711; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 712; CHECK-NEXT: ret <2 x double> [[BO]] 713; 714 %ins = insertelement <2 x double> undef, double %x, i32 1 715 %bo = frem ninf <2 x double> %ins, <double undef, double 42.0> 716 ret <2 x double> %bo 717} 718 719define <2 x double> @frem_constant_op1_not_undef_lane(double %x) { 720; CHECK-LABEL: @frem_constant_op1_not_undef_lane( 721; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem nnan double [[X:%.*]], 4.200000e+01 722; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 0 723; CHECK-NEXT: ret <2 x double> [[BO]] 724; 725 %ins = insertelement <2 x double> undef, double %x, i32 0 726 %bo = frem nnan <2 x double> %ins, <double 42.0, double -42.0> 727 ret <2 x double> %bo 728} 729