1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=vector-combine -S -mtriple=x86_64-- -mattr=SSE2 | FileCheck %s --check-prefixes=CHECK,SSE 3; RUN: opt < %s -passes=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(ptr %p) { 28; CHECK-LABEL: @add_constant_load( 29; CHECK-NEXT: [[LD:%.*]] = load i64, ptr [[P:%.*]], align 8 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, ptr %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> poison, 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> poison, 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(ptr %p) { 154; CHECK-LABEL: @shl_constant_op0_load( 155; CHECK-NEXT: [[LD:%.*]] = load i64, ptr [[P:%.*]], align 8 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, ptr %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; CHECK-LABEL: @shl_constant_op0_multiuse( 168; CHECK-NEXT: [[INS:%.*]] = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 [[A0:%.*]], i32 0 169; CHECK-NEXT: [[MUL_SCALAR:%.*]] = shl i32 [[A0]], 3 170; CHECK-NEXT: [[MUL:%.*]] = insertelement <4 x i32> <i32 0, i32 16, i32 64, i32 192>, i32 [[MUL_SCALAR]], i64 0 171; CHECK-NEXT: [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]] 172; CHECK-NEXT: [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]] 173; CHECK-NEXT: ret <4 x i32> [[XOR]] 174; 175 %ins = insertelement <4 x i32> <i32 undef, i32 1, i32 2, i32 3>, i32 %a0, i32 0 176 %mul = shl <4 x i32> %ins, <i32 3, i32 4, i32 5, i32 6> 177 %and = and <4 x i32> %ins, %a1 178 %xor = xor <4 x i32> %and, %mul 179 ret <4 x i32> %xor 180} 181 182define <2 x i64> @shl_constant_op1(i64 %x) { 183; CHECK-LABEL: @shl_constant_op1( 184; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5 185; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0 186; CHECK-NEXT: ret <2 x i64> [[BO]] 187; 188 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 189 %bo = shl nuw <2 x i64> %ins, <i64 5, i64 undef> 190 ret <2 x i64> %bo 191} 192 193define <2 x i64> @shl_constant_op1_not_undef_lane(i64 %x) { 194; CHECK-LABEL: @shl_constant_op1_not_undef_lane( 195; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5 196; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 197; CHECK-NEXT: ret <2 x i64> [[BO]] 198; 199 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 200 %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2> 201 ret <2 x i64> %bo 202} 203 204define <2 x i64> @shl_constant_op1_load(ptr %p) { 205; CHECK-LABEL: @shl_constant_op1_load( 206; CHECK-NEXT: [[LD:%.*]] = load i64, ptr [[P:%.*]], align 8 207; CHECK-NEXT: [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0 208; CHECK-NEXT: [[BO:%.*]] = shl nuw <2 x i64> [[INS]], <i64 5, i64 2> 209; CHECK-NEXT: ret <2 x i64> [[BO]] 210; 211 %ld = load i64, ptr %p 212 %ins = insertelement <2 x i64> undef, i64 %ld, i32 0 213 %bo = shl nuw <2 x i64> %ins, <i64 5, i64 2> 214 ret <2 x i64> %bo 215} 216 217define <2 x i64> @ashr_constant_op0(i64 %x) { 218; CHECK-LABEL: @ashr_constant_op0( 219; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]] 220; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 1 221; CHECK-NEXT: ret <2 x i64> [[BO]] 222; 223 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 224 %bo = ashr exact <2 x i64> <i64 undef, i64 2>, %ins 225 ret <2 x i64> %bo 226} 227 228define <2 x i64> @ashr_constant_op0_not_undef_lane(i64 %x) { 229; CHECK-LABEL: @ashr_constant_op0_not_undef_lane( 230; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]] 231; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 1 232; CHECK-NEXT: ret <2 x i64> [[BO]] 233; 234 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 235 %bo = ashr exact <2 x i64> <i64 5, i64 2>, %ins 236 ret <2 x i64> %bo 237} 238 239define <2 x i64> @ashr_constant_op1(i64 %x) { 240; CHECK-LABEL: @ashr_constant_op1( 241; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5 242; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 poison>, i64 [[BO_SCALAR]], i64 0 243; CHECK-NEXT: ret <2 x i64> [[BO]] 244; 245 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 246 %bo = ashr <2 x i64> %ins, <i64 5, i64 undef> 247 ret <2 x i64> %bo 248} 249 250define <2 x i64> @ashr_constant_op1_not_undef_lane(i64 %x) { 251; CHECK-LABEL: @ashr_constant_op1_not_undef_lane( 252; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5 253; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 254; CHECK-NEXT: ret <2 x i64> [[BO]] 255; 256 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 257 %bo = ashr <2 x i64> %ins, <i64 5, i64 2> 258 ret <2 x i64> %bo 259} 260 261define <2 x i64> @lshr_constant_op0(i64 %x) { 262; CHECK-LABEL: @lshr_constant_op0( 263; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]] 264; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 265; CHECK-NEXT: ret <2 x i64> [[BO]] 266; 267 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 268 %bo = lshr <2 x i64> <i64 5, i64 undef>, %ins 269 ret <2 x i64> %bo 270} 271 272define <2 x i64> @lshr_constant_op0_not_undef_lane(i64 %x) { 273; CHECK-LABEL: @lshr_constant_op0_not_undef_lane( 274; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]] 275; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 276; CHECK-NEXT: ret <2 x i64> [[BO]] 277; 278 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 279 %bo = lshr <2 x i64> <i64 5, i64 2>, %ins 280 ret <2 x i64> %bo 281} 282 283define <2 x i64> @lshr_constant_op1(i64 %x) { 284; CHECK-LABEL: @lshr_constant_op1( 285; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2 286; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 287; CHECK-NEXT: ret <2 x i64> [[BO]] 288; 289 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 290 %bo = lshr exact <2 x i64> %ins, <i64 undef, i64 2> 291 ret <2 x i64> %bo 292} 293 294define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) { 295; CHECK-LABEL: @lshr_constant_op1_not_undef_lane( 296; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2 297; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 298; CHECK-NEXT: ret <2 x i64> [[BO]] 299; 300 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 301 %bo = lshr exact <2 x i64> %ins, <i64 5, i64 2> 302 ret <2 x i64> %bo 303} 304 305define <2 x i64> @urem_constant_op0(i64 %x) { 306; CHECK-LABEL: @urem_constant_op0( 307; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] 308; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 309; CHECK-NEXT: ret <2 x i64> [[BO]] 310; 311 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 312 %bo = urem <2 x i64> <i64 5, i64 undef>, %ins 313 ret <2 x i64> %bo 314} 315 316define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) { 317; CHECK-LABEL: @urem_constant_op0_not_undef_lane( 318; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] 319; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 320; CHECK-NEXT: ret <2 x i64> [[BO]] 321; 322 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 323 %bo = urem <2 x i64> <i64 5, i64 2>, %ins 324 ret <2 x i64> %bo 325} 326 327define <2 x i64> @urem_constant_op1(i64 %x) { 328; CHECK-LABEL: @urem_constant_op1( 329; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2 330; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 331; CHECK-NEXT: ret <2 x i64> [[BO]] 332; 333 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 334 %bo = urem <2 x i64> %ins, <i64 undef, i64 2> 335 ret <2 x i64> %bo 336} 337 338define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) { 339; CHECK-LABEL: @urem_constant_op1_not_undef_lane( 340; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2 341; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 342; CHECK-NEXT: ret <2 x i64> [[BO]] 343; 344 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 345 %bo = urem <2 x i64> %ins, <i64 5, i64 2> 346 ret <2 x i64> %bo 347} 348 349define <2 x i64> @srem_constant_op0(i64 %x) { 350; CHECK-LABEL: @srem_constant_op0( 351; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] 352; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 353; CHECK-NEXT: ret <2 x i64> [[BO]] 354; 355 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 356 %bo = srem <2 x i64> <i64 5, i64 undef>, %ins 357 ret <2 x i64> %bo 358} 359 360define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) { 361; CHECK-LABEL: @srem_constant_op0_not_undef_lane( 362; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] 363; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 364; CHECK-NEXT: ret <2 x i64> [[BO]] 365; 366 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 367 %bo = srem <2 x i64> <i64 5, i64 2>, %ins 368 ret <2 x i64> %bo 369} 370 371define <2 x i64> @srem_constant_op1(i64 %x) { 372; CHECK-LABEL: @srem_constant_op1( 373; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2 374; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 375; CHECK-NEXT: ret <2 x i64> [[BO]] 376; 377 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 378 %bo = srem <2 x i64> %ins, <i64 undef, i64 2> 379 ret <2 x i64> %bo 380} 381 382define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) { 383; CHECK-LABEL: @srem_constant_op1_not_undef_lane( 384; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2 385; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 386; CHECK-NEXT: ret <2 x i64> [[BO]] 387; 388 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 389 %bo = srem <2 x i64> %ins, <i64 5, i64 2> 390 ret <2 x i64> %bo 391} 392 393define <2 x i64> @udiv_constant_op0(i64 %x) { 394; CHECK-LABEL: @udiv_constant_op0( 395; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] 396; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 397; CHECK-NEXT: ret <2 x i64> [[BO]] 398; 399 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 400 %bo = udiv exact <2 x i64> <i64 5, i64 undef>, %ins 401 ret <2 x i64> %bo 402} 403 404define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) { 405; CHECK-LABEL: @udiv_constant_op0_not_undef_lane( 406; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] 407; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 408; CHECK-NEXT: ret <2 x i64> [[BO]] 409; 410 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 411 %bo = udiv exact <2 x i64> <i64 5, i64 2>, %ins 412 ret <2 x i64> %bo 413} 414 415define <2 x i64> @udiv_constant_op1(i64 %x) { 416; CHECK-LABEL: @udiv_constant_op1( 417; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2 418; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 419; CHECK-NEXT: ret <2 x i64> [[BO]] 420; 421 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 422 %bo = udiv <2 x i64> %ins, <i64 undef, i64 2> 423 ret <2 x i64> %bo 424} 425 426define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) { 427; CHECK-LABEL: @udiv_constant_op1_not_undef_lane( 428; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2 429; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 430; CHECK-NEXT: ret <2 x i64> [[BO]] 431; 432 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 433 %bo = udiv <2 x i64> %ins, <i64 5, i64 2> 434 ret <2 x i64> %bo 435} 436 437define <2 x i64> @sdiv_constant_op0(i64 %x) { 438; CHECK-LABEL: @sdiv_constant_op0( 439; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] 440; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 441; CHECK-NEXT: ret <2 x i64> [[BO]] 442; 443 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 444 %bo = sdiv <2 x i64> <i64 5, i64 undef>, %ins 445 ret <2 x i64> %bo 446} 447 448define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) { 449; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane( 450; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] 451; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> poison, i64 [[BO_SCALAR]], i64 0 452; CHECK-NEXT: ret <2 x i64> [[BO]] 453; 454 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 455 %bo = sdiv <2 x i64> <i64 5, i64 2>, %ins 456 ret <2 x i64> %bo 457} 458 459define <2 x i64> @sdiv_constant_op1(i64 %x) { 460; CHECK-LABEL: @sdiv_constant_op1( 461; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2 462; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 poison, i64 0>, i64 [[BO_SCALAR]], i64 1 463; CHECK-NEXT: ret <2 x i64> [[BO]] 464; 465 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 466 %bo = sdiv exact <2 x i64> %ins, <i64 undef, i64 2> 467 ret <2 x i64> %bo 468} 469 470define <2 x i64> @sdiv_constant_op1_not_undef_lane(i64 %x) { 471; CHECK-LABEL: @sdiv_constant_op1_not_undef_lane( 472; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2 473; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 474; CHECK-NEXT: ret <2 x i64> [[BO]] 475; 476 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 477 %bo = sdiv exact <2 x i64> %ins, <i64 5, i64 2> 478 ret <2 x i64> %bo 479} 480 481define <2 x i64> @and_constant(i64 %x) { 482; CHECK-LABEL: @and_constant( 483; CHECK-NEXT: [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42 484; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 0, i64 undef>, i64 [[BO_SCALAR]], i64 0 485; CHECK-NEXT: ret <2 x i64> [[BO]] 486; 487 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 488 %bo = and <2 x i64> %ins, <i64 42, i64 undef> 489 ret <2 x i64> %bo 490} 491 492define <2 x i64> @and_constant_not_undef_lane(i64 %x) { 493; CHECK-LABEL: @and_constant_not_undef_lane( 494; CHECK-NEXT: [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42 495; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 496; CHECK-NEXT: ret <2 x i64> [[BO]] 497; 498 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 499 %bo = and <2 x i64> %ins, <i64 42, i64 -42> 500 ret <2 x i64> %bo 501} 502 503define <2 x i64> @or_constant(i64 %x) { 504; CHECK-LABEL: @or_constant( 505; CHECK-NEXT: [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42 506; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 -1>, i64 [[BO_SCALAR]], i64 1 507; CHECK-NEXT: ret <2 x i64> [[BO]] 508; 509 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 510 %bo = or <2 x i64> %ins, <i64 undef, i64 -42> 511 ret <2 x i64> %bo 512} 513 514define <2 x i64> @or_constant_not_undef_lane(i64 %x) { 515; CHECK-LABEL: @or_constant_not_undef_lane( 516; CHECK-NEXT: [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42 517; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> splat (i64 -1), i64 [[BO_SCALAR]], i64 1 518; CHECK-NEXT: ret <2 x i64> [[BO]] 519; 520 %ins = insertelement <2 x i64> undef, i64 %x, i32 1 521 %bo = or <2 x i64> %ins, <i64 42, i64 -42> 522 ret <2 x i64> %bo 523} 524 525define <2 x i64> @xor_constant(i64 %x) { 526; CHECK-LABEL: @xor_constant( 527; CHECK-NEXT: [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42 528; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> <i64 undef, i64 0>, i64 [[BO_SCALAR]], i64 0 529; CHECK-NEXT: ret <2 x i64> [[BO]] 530; 531 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 532 %bo = xor <2 x i64> %ins, <i64 42, i64 undef> 533 ret <2 x i64> %bo 534} 535 536define <2 x i64> @xor_constant_not_undef_lane(i64 %x) { 537; CHECK-LABEL: @xor_constant_not_undef_lane( 538; CHECK-NEXT: [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42 539; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 540; CHECK-NEXT: ret <2 x i64> [[BO]] 541; 542 %ins = insertelement <2 x i64> undef, i64 %x, i32 0 543 %bo = xor <2 x i64> %ins, <i64 42, i64 -42> 544 ret <2 x i64> %bo 545} 546 547define <2 x double> @fadd_constant(double %x) { 548; CHECK-LABEL: @fadd_constant( 549; CHECK-NEXT: [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], 4.200000e+01 550; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 551; CHECK-NEXT: ret <2 x double> [[BO]] 552; 553 %ins = insertelement <2 x double> undef, double %x, i32 0 554 %bo = fadd <2 x double> %ins, <double 42.0, double undef> 555 ret <2 x double> %bo 556} 557 558define <2 x double> @fadd_constant_not_undef_lane(double %x) { 559; CHECK-LABEL: @fadd_constant_not_undef_lane( 560; CHECK-NEXT: [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], -4.200000e+01 561; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1 562; CHECK-NEXT: ret <2 x double> [[BO]] 563; 564 %ins = insertelement <2 x double> undef, double %x, i32 1 565 %bo = fadd <2 x double> %ins, <double 42.0, double -42.0> 566 ret <2 x double> %bo 567} 568 569define <2 x double> @fsub_constant_op0(double %x) { 570; CHECK-LABEL: @fsub_constant_op0( 571; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub fast double 4.200000e+01, [[X:%.*]] 572; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 573; CHECK-NEXT: ret <2 x double> [[BO]] 574; 575 %ins = insertelement <2 x double> undef, double %x, i32 0 576 %bo = fsub fast <2 x double> <double 42.0, double undef>, %ins 577 ret <2 x double> %bo 578} 579 580define <2 x double> @fsub_constant_op0_not_undef_lane(double %x) { 581; CHECK-LABEL: @fsub_constant_op0_not_undef_lane( 582; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub nsz double -4.200000e+01, [[X:%.*]] 583; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1 584; CHECK-NEXT: ret <2 x double> [[BO]] 585; 586 %ins = insertelement <2 x double> undef, double %x, i32 1 587 %bo = fsub nsz <2 x double> <double 42.0, double -42.0>, %ins 588 ret <2 x double> %bo 589} 590 591define <2 x double> @fsub_constant_op1(double %x) { 592; CHECK-LABEL: @fsub_constant_op1( 593; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01 594; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 595; CHECK-NEXT: ret <2 x double> [[BO]] 596; 597 %ins = insertelement <2 x double> undef, double %x, i32 1 598 %bo = fsub <2 x double> %ins, <double undef, double 42.0> 599 ret <2 x double> %bo 600} 601 602define <2 x double> @fsub_constant_op1_not_undef_lane(double %x) { 603; CHECK-LABEL: @fsub_constant_op1_not_undef_lane( 604; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01 605; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0 606; CHECK-NEXT: ret <2 x double> [[BO]] 607; 608 %ins = insertelement <2 x double> undef, double %x, i32 0 609 %bo = fsub <2 x double> %ins, <double 42.0, double -42.0> 610 ret <2 x double> %bo 611} 612 613define <2 x double> @fmul_constant(double %x) { 614; CHECK-LABEL: @fmul_constant( 615; CHECK-NEXT: [[BO_SCALAR:%.*]] = fmul reassoc double [[X:%.*]], 4.200000e+01 616; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 617; CHECK-NEXT: ret <2 x double> [[BO]] 618; 619 %ins = insertelement <2 x double> undef, double %x, i32 0 620 %bo = fmul reassoc <2 x double> %ins, <double 42.0, double undef> 621 ret <2 x double> %bo 622} 623 624define <2 x double> @fmul_constant_not_undef_lane(double %x) { 625; CHECK-LABEL: @fmul_constant_not_undef_lane( 626; CHECK-NEXT: [[BO_SCALAR:%.*]] = fmul double [[X:%.*]], -4.200000e+01 627; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1 628; CHECK-NEXT: ret <2 x double> [[BO]] 629; 630 %ins = insertelement <2 x double> undef, double %x, i32 1 631 %bo = fmul <2 x double> %ins, <double 42.0, double -42.0> 632 ret <2 x double> %bo 633} 634 635define <2 x double> @fdiv_constant_op0(double %x) { 636; CHECK-LABEL: @fdiv_constant_op0( 637; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv nnan double 4.200000e+01, [[X:%.*]] 638; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 639; CHECK-NEXT: ret <2 x double> [[BO]] 640; 641 %ins = insertelement <2 x double> undef, double %x, i32 1 642 %bo = fdiv nnan <2 x double> <double undef, double 42.0>, %ins 643 ret <2 x double> %bo 644} 645 646define <2 x double> @fdiv_constant_op0_not_undef_lane(double %x) { 647; CHECK-LABEL: @fdiv_constant_op0_not_undef_lane( 648; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv ninf double 4.200000e+01, [[X:%.*]] 649; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0 650; CHECK-NEXT: ret <2 x double> [[BO]] 651; 652 %ins = insertelement <2 x double> undef, double %x, i32 0 653 %bo = fdiv ninf <2 x double> <double 42.0, double -42.0>, %ins 654 ret <2 x double> %bo 655} 656 657define <2 x double> @fdiv_constant_op1(double %x) { 658; CHECK-LABEL: @fdiv_constant_op1( 659; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01 660; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 661; CHECK-NEXT: ret <2 x double> [[BO]] 662; 663 %ins = insertelement <2 x double> undef, double %x, i32 0 664 %bo = fdiv <2 x double> %ins, <double 42.0, double undef> 665 ret <2 x double> %bo 666} 667 668define <2 x double> @fdiv_constant_op1_not_undef_lane(double %x) { 669; CHECK-LABEL: @fdiv_constant_op1_not_undef_lane( 670; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01 671; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0 672; CHECK-NEXT: ret <2 x double> [[BO]] 673; 674 %ins = insertelement <2 x double> undef, double %x, i32 0 675 %bo = fdiv <2 x double> %ins, <double 42.0, double -42.0> 676 ret <2 x double> %bo 677} 678 679define <2 x double> @frem_constant_op0(double %x) { 680; CHECK-LABEL: @frem_constant_op0( 681; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem fast double 4.200000e+01, [[X:%.*]] 682; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double 0x7FF8000000000000, double undef>, double [[BO_SCALAR]], i64 0 683; CHECK-NEXT: ret <2 x double> [[BO]] 684; 685 %ins = insertelement <2 x double> undef, double %x, i32 0 686 %bo = frem fast <2 x double> <double 42.0, double undef>, %ins 687 ret <2 x double> %bo 688} 689 690define <2 x double> @frem_constant_op0_not_undef_lane(double %x) { 691; CHECK-LABEL: @frem_constant_op0_not_undef_lane( 692; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem double -4.200000e+01, [[X:%.*]] 693; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 1 694; CHECK-NEXT: ret <2 x double> [[BO]] 695; 696 %ins = insertelement <2 x double> undef, double %x, i32 1 697 %bo = frem <2 x double> <double 42.0, double -42.0>, %ins 698 ret <2 x double> %bo 699} 700 701define <2 x double> @frem_constant_op1(double %x) { 702; CHECK-LABEL: @frem_constant_op1( 703; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem ninf double [[X:%.*]], 4.200000e+01 704; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> <double undef, double 0x7FF8000000000000>, double [[BO_SCALAR]], i64 1 705; CHECK-NEXT: ret <2 x double> [[BO]] 706; 707 %ins = insertelement <2 x double> undef, double %x, i32 1 708 %bo = frem ninf <2 x double> %ins, <double undef, double 42.0> 709 ret <2 x double> %bo 710} 711 712define <2 x double> @frem_constant_op1_not_undef_lane(double %x) { 713; CHECK-LABEL: @frem_constant_op1_not_undef_lane( 714; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem nnan double [[X:%.*]], 4.200000e+01 715; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> splat (double 0x7FF8000000000000), double [[BO_SCALAR]], i64 0 716; CHECK-NEXT: ret <2 x double> [[BO]] 717; 718 %ins = insertelement <2 x double> undef, double %x, i32 0 719 %bo = frem nnan <2 x double> %ins, <double 42.0, double -42.0> 720 ret <2 x double> %bo 721} 722