; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -vector-combine -S -mtriple=x86_64-- -mattr=SSE2 | FileCheck %s --check-prefixes=CHECK,SSE ; RUN: opt < %s -vector-combine -S -mtriple=x86_64-- -mattr=AVX2 | FileCheck %s --check-prefixes=CHECK,AVX define <2 x i64> @add_constant(i64 %x) { ; CHECK-LABEL: @add_constant( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = add i64 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = add <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @add_constant_not_undef_lane(i64 %x) { ; CHECK-LABEL: @add_constant_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = add i64 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = add <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @add_constant_load(i64* %p) { ; CHECK-LABEL: @add_constant_load( ; CHECK-NEXT: [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4 ; CHECK-NEXT: [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0 ; CHECK-NEXT: [[BO:%.*]] = add <2 x i64> [[INS]], ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ld = load i64, i64* %p %ins = insertelement <2 x i64> undef, i64 %ld, i32 0 %bo = add <2 x i64> %ins, ret <2 x i64> %bo } ; IR flags are not required, but they should propagate. define <4 x i32> @sub_constant_op0(i32 %x) { ; CHECK-LABEL: @sub_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw nsw i32 -42, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <4 x i32> undef, i32 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <4 x i32> [[BO]] ; %ins = insertelement <4 x i32> undef, i32 %x, i32 1 %bo = sub nsw nuw <4 x i32> , %ins ret <4 x i32> %bo } define <4 x i32> @sub_constant_op0_not_undef_lane(i32 %x) { ; CHECK-LABEL: @sub_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw i32 42, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <4 x i32> undef, i32 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <4 x i32> [[BO]] ; %ins = insertelement <4 x i32> undef, i32 %x, i32 1 %bo = sub nuw <4 x i32> , %ins ret <4 x i32> %bo } define <8 x i16> @sub_constant_op1(i16 %x) { ; CHECK-LABEL: @sub_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw i16 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <8 x i16> undef, i16 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <8 x i16> [[BO]] ; %ins = insertelement <8 x i16> undef, i16 %x, i32 0 %bo = sub nuw <8 x i16> %ins, ret <8 x i16> %bo } define <8 x i16> @sub_constant_op1_not_undef_lane(i16 %x) { ; CHECK-LABEL: @sub_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sub nuw i16 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <8 x i16> undef, i16 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <8 x i16> [[BO]] ; %ins = insertelement <8 x i16> undef, i16 %x, i32 0 %bo = sub nuw <8 x i16> %ins, ret <8 x i16> %bo } define <16 x i8> @mul_constant(i8 %x) { ; CHECK-LABEL: @mul_constant( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = mul i8 [[X:%.*]], -42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <16 x i8> , i8 [[BO_SCALAR]], i64 2 ; CHECK-NEXT: ret <16 x i8> [[BO]] ; %ins = insertelement <16 x i8> undef, i8 %x, i32 2 %bo = mul <16 x i8> %ins, ret <16 x i8> %bo } define <3 x i64> @mul_constant_not_undef_lane(i64 %x) { ; CHECK-LABEL: @mul_constant_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = mul i64 [[X:%.*]], -42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <3 x i64> , i64 [[BO_SCALAR]], i64 2 ; CHECK-NEXT: ret <3 x i64> [[BO]] ; %ins = insertelement <3 x i64> undef, i64 %x, i32 2 %bo = mul <3 x i64> %ins, ret <3 x i64> %bo } define <16 x i8> @mul_constant_multiuse(i8 %a0, <16 x i8> %a1) { ; SSE-LABEL: @mul_constant_multiuse( ; SSE-NEXT: [[INS:%.*]] = insertelement <16 x i8> , i8 [[A0:%.*]], i32 0 ; SSE-NEXT: [[MUL:%.*]] = mul <16 x i8> [[INS]], ; SSE-NEXT: [[AND:%.*]] = and <16 x i8> [[INS]], [[A1:%.*]] ; SSE-NEXT: [[XOR:%.*]] = xor <16 x i8> [[AND]], [[MUL]] ; SSE-NEXT: ret <16 x i8> [[XOR]] ; ; AVX-LABEL: @mul_constant_multiuse( ; AVX-NEXT: [[INS:%.*]] = insertelement <16 x i8> , i8 [[A0:%.*]], i32 0 ; AVX-NEXT: [[MUL_SCALAR:%.*]] = mul i8 [[A0]], 3 ; AVX-NEXT: [[MUL:%.*]] = insertelement <16 x i8> , i8 [[MUL_SCALAR]], i64 0 ; AVX-NEXT: [[AND:%.*]] = and <16 x i8> [[INS]], [[A1:%.*]] ; AVX-NEXT: [[XOR:%.*]] = xor <16 x i8> [[AND]], [[MUL]] ; AVX-NEXT: ret <16 x i8> [[XOR]] ; %ins = insertelement <16 x i8> , i8 %a0, i32 0 %mul = mul <16 x i8> %ins, %and = and <16 x i8> %ins, %a1 %xor = xor <16 x i8> %and, %mul ret <16 x i8> %xor } define <2 x i64> @shl_constant_op0(i64 %x) { ; CHECK-LABEL: @shl_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl i64 2, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = shl <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @shl_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @shl_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl i64 2, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = shl <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @shl_constant_op0_load(i64* %p) { ; CHECK-LABEL: @shl_constant_op0_load( ; CHECK-NEXT: [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4 ; CHECK-NEXT: [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 1 ; CHECK-NEXT: [[BO:%.*]] = shl <2 x i64> , [[INS]] ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ld = load i64, i64* %p %ins = insertelement <2 x i64> undef, i64 %ld, i32 1 %bo = shl <2 x i64> , %ins ret <2 x i64> %bo } define <4 x i32> @shl_constant_op0_multiuse(i32 %a0, <4 x i32> %a1) { ; SSE-LABEL: @shl_constant_op0_multiuse( ; SSE-NEXT: [[INS:%.*]] = insertelement <4 x i32> , i32 [[A0:%.*]], i32 0 ; SSE-NEXT: [[MUL_SCALAR:%.*]] = shl i32 [[A0]], 3 ; SSE-NEXT: [[MUL:%.*]] = insertelement <4 x i32> , i32 [[MUL_SCALAR]], i64 0 ; SSE-NEXT: [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]] ; SSE-NEXT: [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]] ; SSE-NEXT: ret <4 x i32> [[XOR]] ; ; AVX-LABEL: @shl_constant_op0_multiuse( ; AVX-NEXT: [[INS:%.*]] = insertelement <4 x i32> , i32 [[A0:%.*]], i32 0 ; AVX-NEXT: [[MUL:%.*]] = shl <4 x i32> [[INS]], ; AVX-NEXT: [[AND:%.*]] = and <4 x i32> [[INS]], [[A1:%.*]] ; AVX-NEXT: [[XOR:%.*]] = xor <4 x i32> [[AND]], [[MUL]] ; AVX-NEXT: ret <4 x i32> [[XOR]] ; %ins = insertelement <4 x i32> , i32 %a0, i32 0 %mul = shl <4 x i32> %ins, %and = and <4 x i32> %ins, %a1 %xor = xor <4 x i32> %and, %mul ret <4 x i32> %xor } define <2 x i64> @shl_constant_op1(i64 %x) { ; CHECK-LABEL: @shl_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = shl nuw <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @shl_constant_op1_not_undef_lane(i64 %x) { ; CHECK-LABEL: @shl_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = shl nuw i64 [[X:%.*]], 5 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = shl nuw <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @shl_constant_op1_load(i64* %p) { ; CHECK-LABEL: @shl_constant_op1_load( ; CHECK-NEXT: [[LD:%.*]] = load i64, i64* [[P:%.*]], align 4 ; CHECK-NEXT: [[INS:%.*]] = insertelement <2 x i64> undef, i64 [[LD]], i32 0 ; CHECK-NEXT: [[BO:%.*]] = shl nuw <2 x i64> [[INS]], ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ld = load i64, i64* %p %ins = insertelement <2 x i64> undef, i64 %ld, i32 0 %bo = shl nuw <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @ashr_constant_op0(i64 %x) { ; CHECK-LABEL: @ashr_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = ashr exact <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @ashr_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @ashr_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr exact i64 2, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = ashr exact <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @ashr_constant_op1(i64 %x) { ; CHECK-LABEL: @ashr_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = ashr <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @ashr_constant_op1_not_undef_lane(i64 %x) { ; CHECK-LABEL: @ashr_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = ashr i64 [[X:%.*]], 5 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = ashr <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @lshr_constant_op0(i64 %x) { ; CHECK-LABEL: @lshr_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = lshr <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @lshr_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @lshr_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = lshr <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @lshr_constant_op1(i64 %x) { ; CHECK-LABEL: @lshr_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = lshr exact <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @lshr_constant_op1_not_undef_lane(i64 %x) { ; CHECK-LABEL: @lshr_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = lshr exact i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = lshr exact <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @urem_constant_op0(i64 %x) { ; CHECK-LABEL: @urem_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = urem <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @urem_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @urem_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = urem <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @urem_constant_op1(i64 %x) { ; CHECK-LABEL: @urem_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = urem <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @urem_constant_op1_not_undef_lane(i64 %x) { ; CHECK-LABEL: @urem_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = urem i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = urem <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @srem_constant_op0(i64 %x) { ; CHECK-LABEL: @srem_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = srem <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @srem_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @srem_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = srem <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @srem_constant_op1(i64 %x) { ; CHECK-LABEL: @srem_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = srem <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @srem_constant_op1_not_undef_lane(i64 %x) { ; CHECK-LABEL: @srem_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = srem i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = srem <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @udiv_constant_op0(i64 %x) { ; CHECK-LABEL: @udiv_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = udiv exact <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @udiv_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @udiv_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv exact i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = udiv exact <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @udiv_constant_op1(i64 %x) { ; CHECK-LABEL: @udiv_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = udiv <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @udiv_constant_op1_not_undef_lane(i64 %x) { ; CHECK-LABEL: @udiv_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = udiv i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = udiv <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @sdiv_constant_op0(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = sdiv <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @sdiv_constant_op0_not_undef_lane(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv i64 5, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = sdiv <2 x i64> , %ins ret <2 x i64> %bo } define <2 x i64> @sdiv_constant_op1(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = sdiv exact <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @sdiv_constant_op1_not_undef_lane(i64 %x) { ; CHECK-LABEL: @sdiv_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = sdiv exact i64 [[X:%.*]], 2 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = sdiv exact <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @and_constant(i64 %x) { ; CHECK-LABEL: @and_constant( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = and <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @and_constant_not_undef_lane(i64 %x) { ; CHECK-LABEL: @and_constant_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = and i64 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> zeroinitializer, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = and <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @or_constant(i64 %x) { ; CHECK-LABEL: @or_constant( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = or <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @or_constant_not_undef_lane(i64 %x) { ; CHECK-LABEL: @or_constant_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = or i64 [[X:%.*]], -42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 1 %bo = or <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @xor_constant(i64 %x) { ; CHECK-LABEL: @xor_constant( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> , i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = xor <2 x i64> %ins, ret <2 x i64> %bo } define <2 x i64> @xor_constant_not_undef_lane(i64 %x) { ; CHECK-LABEL: @xor_constant_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = xor i64 [[X:%.*]], 42 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x i64> undef, i64 [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x i64> [[BO]] ; %ins = insertelement <2 x i64> undef, i64 %x, i32 0 %bo = xor <2 x i64> %ins, ret <2 x i64> %bo } define <2 x double> @fadd_constant(double %x) { ; CHECK-LABEL: @fadd_constant( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = fadd <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @fadd_constant_not_undef_lane(double %x) { ; CHECK-LABEL: @fadd_constant_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fadd double [[X:%.*]], -4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 1 %bo = fadd <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @fsub_constant_op0(double %x) { ; CHECK-LABEL: @fsub_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub fast double 4.200000e+01, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = fsub fast <2 x double> , %ins ret <2 x double> %bo } define <2 x double> @fsub_constant_op0_not_undef_lane(double %x) { ; CHECK-LABEL: @fsub_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub nsz double -4.200000e+01, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 1 %bo = fsub nsz <2 x double> , %ins ret <2 x double> %bo } define <2 x double> @fsub_constant_op1(double %x) { ; CHECK-LABEL: @fsub_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 1 %bo = fsub <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @fsub_constant_op1_not_undef_lane(double %x) { ; CHECK-LABEL: @fsub_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fsub double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = fsub <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @fmul_constant(double %x) { ; CHECK-LABEL: @fmul_constant( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fmul reassoc double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = fmul reassoc <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @fmul_constant_not_undef_lane(double %x) { ; CHECK-LABEL: @fmul_constant_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fmul double [[X:%.*]], -4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 1 %bo = fmul <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @fdiv_constant_op0(double %x) { ; CHECK-LABEL: @fdiv_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv nnan double 4.200000e+01, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 1 %bo = fdiv nnan <2 x double> , %ins ret <2 x double> %bo } define <2 x double> @fdiv_constant_op0_not_undef_lane(double %x) { ; CHECK-LABEL: @fdiv_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv ninf double 4.200000e+01, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = fdiv ninf <2 x double> , %ins ret <2 x double> %bo } define <2 x double> @fdiv_constant_op1(double %x) { ; CHECK-LABEL: @fdiv_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = fdiv <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @fdiv_constant_op1_not_undef_lane(double %x) { ; CHECK-LABEL: @fdiv_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = fdiv double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = fdiv <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @frem_constant_op0(double %x) { ; CHECK-LABEL: @frem_constant_op0( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem fast double 4.200000e+01, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = frem fast <2 x double> , %ins ret <2 x double> %bo } define <2 x double> @frem_constant_op0_not_undef_lane(double %x) { ; CHECK-LABEL: @frem_constant_op0_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem double -4.200000e+01, [[X:%.*]] ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 1 %bo = frem <2 x double> , %ins ret <2 x double> %bo } define <2 x double> @frem_constant_op1(double %x) { ; CHECK-LABEL: @frem_constant_op1( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem ninf double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 1 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 1 %bo = frem ninf <2 x double> %ins, ret <2 x double> %bo } define <2 x double> @frem_constant_op1_not_undef_lane(double %x) { ; CHECK-LABEL: @frem_constant_op1_not_undef_lane( ; CHECK-NEXT: [[BO_SCALAR:%.*]] = frem nnan double [[X:%.*]], 4.200000e+01 ; CHECK-NEXT: [[BO:%.*]] = insertelement <2 x double> , double [[BO_SCALAR]], i64 0 ; CHECK-NEXT: ret <2 x double> [[BO]] ; %ins = insertelement <2 x double> undef, double %x, i32 0 %bo = frem nnan <2 x double> %ins, ret <2 x double> %bo }