; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes='vector-combine' -S %s | FileCheck %s target triple = "aarch64-none-eabi" define <16 x i32> @test1(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test1( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define i32 @test1_reduce(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test1_reduce( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add nsw <16 x i32> [[TMP2]], [[TMP4]] ; CHECK-NEXT: [[TMP6:%.*]] = sub nsw <16 x i32> [[TMP1]], [[TMP3]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: [[R:%.*]] = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> [[S3]]) ; CHECK-NEXT: ret i32 [[R]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %r = call i32 @llvm.vector.reduce.add(<16 x i32> %s3) ret i32 %r } declare i32 @llvm.vector.reduce.add(<16 x i32>) define <16 x i32> @test1more(<16 x i32> %a1, <16 x i32> %a2) { ; CHECK-LABEL: @test1more( ; CHECK-NEXT: [[X:%.*]] = add nsw <16 x i32> [[A1:%.*]], [[A2:%.*]] ; CHECK-NEXT: [[Y:%.*]] = sub nsw <16 x i32> [[A1]], [[A2]] ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %x = add nsw <16 x i32> %a1, %a2 %y = sub nsw <16 x i32> %a1, %a2 %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @test1mores(<16 x i32> %a1, <16 x i32> %a2) { ; CHECK-LABEL: @test1mores( ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A1:%.*]], <16 x i32> [[A2:%.*]], <16 x i32> ; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[A2]], <16 x i32> [[A1]], <16 x i32> ; CHECK-NEXT: [[X:%.*]] = add nsw <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: [[Y:%.*]] = sub nsw <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S5:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S5]] ; %s3 = shufflevector <16 x i32> %a1, <16 x i32> %a2, <16 x i32> %s4 = shufflevector <16 x i32> %a2, <16 x i32> %a1, <16 x i32> %x = add nsw <16 x i32> %s3, %s4 %y = sub nsw <16 x i32> %s3, %s4 %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s5 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s5 } define <16 x i32> @test2_1(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test2_1( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @test2_1_ins(<16 x i32> %x1, <16 x i32> %x2) { ; CHECK-LABEL: @test2_1_ins( ; CHECK-NEXT: [[X:%.*]] = add nsw <16 x i32> [[X1:%.*]], [[X2:%.*]] ; CHECK-NEXT: [[Y:%.*]] = sub nsw <16 x i32> [[X1]], [[X2]] ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %x = add nsw <16 x i32> %x1, %x2 %y = sub nsw <16 x i32> %x1, %x2 %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @test2_2(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test2_2( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add nsw <16 x i32> [[TMP2]], [[TMP4]] ; CHECK-NEXT: [[TMP6:%.*]] = sub nsw <16 x i32> [[TMP1]], [[TMP3]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @test2_12(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test2_12( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: [[C:%.*]] = mul <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: ret <16 x i32> [[C]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %s4 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %c = mul <16 x i32> %s3, %s4 ret <16 x i32> %c } define <16 x i32> @test3_1(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test3_1( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @test3_2(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test3_2( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add nsw <16 x i32> [[TMP2]], [[TMP4]] ; CHECK-NEXT: [[TMP6:%.*]] = sub nsw <16 x i32> [[TMP1]], [[TMP3]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @test3_12(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test3_12( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: [[C:%.*]] = add <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: ret <16 x i32> [[C]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %s4 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %c = add <16 x i32> %s3, %s4 ret <16 x i32> %c } define <16 x i32> @test23(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test23( ; CHECK-NEXT: [[S10:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S20:%.*]] = shufflevector <16 x i32> [[Y]], <16 x i32> [[X]], <16 x i32> ; CHECK-NEXT: [[A0:%.*]] = add nsw <16 x i32> [[S10]], [[S20]] ; CHECK-NEXT: [[B0:%.*]] = sub nsw <16 x i32> [[S10]], [[S20]] ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[A0]], <16 x i32> [[B0]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[B0]], <16 x i32> [[A0]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: [[C:%.*]] = add <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: ret <16 x i32> [[C]] ; %s10 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s20 = shufflevector <16 x i32> %y, <16 x i32> %x, <16 x i32> %a0 = add nsw <16 x i32> %s10, %s20 %b0 = sub nsw <16 x i32> %s10, %s20 %s1 = shufflevector <16 x i32> %a0, <16 x i32> %b0, <16 x i32> %s2 = shufflevector <16 x i32> %b0, <16 x i32> %a0, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %s4 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %c = add <16 x i32> %s3, %s4 ret <16 x i32> %c } define <16 x i32> @testgood(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @testgood( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add nsw <16 x i32> [[TMP2]], [[TMP4]] ; CHECK-NEXT: [[TMP6:%.*]] = sub nsw <16 x i32> [[TMP1]], [[TMP3]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @test_shufshufin(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test_shufshufin( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add nsw <16 x i32> [[TMP2]], [[TMP4]] ; CHECK-NEXT: [[TMP6:%.*]] = sub nsw <16 x i32> [[TMP1]], [[TMP3]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %s1, <16 x i32> poison, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> ret <16 x i32> %s3 } define <16 x i32> @testshufshufout(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @testshufshufout( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add nsw <16 x i32> [[TMP2]], [[TMP4]] ; CHECK-NEXT: [[TMP6:%.*]] = sub nsw <16 x i32> [[TMP1]], [[TMP3]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: [[R:%.*]] = add nsw <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: ret <16 x i32> [[R]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %s4 = shufflevector <16 x i32> %s3, <16 x i32> poison, <16 x i32> %r = add nsw <16 x i32> %s3, %s4 ret <16 x i32> %r } define <16 x i32> @testtwoshufout(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @testtwoshufout( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add nsw <16 x i32> [[TMP2]], [[TMP4]] ; CHECK-NEXT: [[TMP6:%.*]] = sub nsw <16 x i32> [[TMP1]], [[TMP3]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: [[ADD:%.*]] = add <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: ret <16 x i32> [[ADD]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %s4 = shufflevector <16 x i32> %b, <16 x i32> %a, <16 x i32> %add = add <16 x i32> %s3, %s4 ret <16 x i32> %add } declare void @use(<16 x i32>) define <16 x i32> @test_extrashuffleuse(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test_extrashuffleuse( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: call void @use(<16 x i32> [[S1]]) ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> call void @use(<16 x i32> %s1) ret <16 x i32> %s3 } define <16 x i32> @test_extraopuse(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @test_extraopuse( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: call void @use(<16 x i32> [[B]]) ; CHECK-NEXT: ret <16 x i32> [[S3]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> call void @use(<16 x i32> %b) ret <16 x i32> %s3 } define <4 x i32> @test_recurse(<4 x i32> %l0, <4 x i32> %l1, <4 x i32> %l3) { ; CHECK-LABEL: @test_recurse( ; CHECK-NEXT: [[S0:%.*]] = shufflevector <4 x i32> [[L3:%.*]], <4 x i32> [[L1:%.*]], <4 x i32> ; CHECK-NEXT: [[S1:%.*]] = shufflevector <4 x i32> [[L1]], <4 x i32> [[L3]], <4 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <4 x i32> [[L0:%.*]], <4 x i32> [[L1]], <4 x i32> ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[S2]], [[S2]] ; CHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> [[S1]], [[S0]] ; CHECK-NEXT: [[T0:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> [[ADD]], <4 x i32> ; CHECK-NEXT: ret <4 x i32> [[T0]] ; %s0 = shufflevector <4 x i32> %l3, <4 x i32> %l1, <4 x i32> %s1 = shufflevector <4 x i32> %l1, <4 x i32> %l3, <4 x i32> %s2 = shufflevector <4 x i32> %l0, <4 x i32> %l1, <4 x i32> %add = add <4 x i32> %s2, %s2 %sub = sub <4 x i32> %s1, %s0 %t0 = shufflevector <4 x i32> %add, <4 x i32> %add, <4 x i32> ret <4 x i32> %t0 } define void @test_31(ptr %src, ptr %dst) { ; CHECK-LABEL: @test_31( ; CHECK-NEXT: [[G0:%.*]] = getelementptr <4 x i32>, ptr [[SRC:%.*]], i32 0 ; CHECK-NEXT: [[L0:%.*]] = load <4 x i32>, ptr [[G0]], align 16 ; CHECK-NEXT: [[S0:%.*]] = shufflevector <4 x i32> [[L0]], <4 x i32> [[L0]], <4 x i32> ; CHECK-NEXT: [[S1:%.*]] = shufflevector <4 x i32> [[L0]], <4 x i32> [[L0]], <4 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <4 x i32> [[L0]], <4 x i32> [[L0]], <4 x i32> ; CHECK-NEXT: [[S3:%.*]] = shufflevector <4 x i32> [[L0]], <4 x i32> [[L0]], <4 x i32> ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[S1]], [[S1]] ; CHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> [[S3]], [[S0]] ; CHECK-NEXT: [[T0:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> [[ADD]], <4 x i32> ; CHECK-NEXT: [[H0:%.*]] = getelementptr <4 x i32>, ptr [[DST:%.*]], i32 0 ; CHECK-NEXT: store <4 x i32> [[T0]], ptr [[H0]], align 16 ; CHECK-NEXT: [[T1:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> [[ADD]], <4 x i32> ; CHECK-NEXT: [[H1:%.*]] = getelementptr <4 x i32>, ptr [[DST]], i32 1 ; CHECK-NEXT: store <4 x i32> [[T1]], ptr [[H1]], align 16 ; CHECK-NEXT: ret void ; %g0 = getelementptr <4 x i32>, ptr %src, i32 0 %l0 = load <4 x i32>, ptr %g0, align 16 %s0 = shufflevector <4 x i32> %l0, <4 x i32> %l0, <4 x i32> %s1 = shufflevector <4 x i32> %l0, <4 x i32> %l0, <4 x i32> %s2 = shufflevector <4 x i32> %l0, <4 x i32> %l0, <4 x i32> %s3 = shufflevector <4 x i32> %l0, <4 x i32> %l0, <4 x i32> %add = add <4 x i32> %s1, %s1 %sub = sub <4 x i32> %s3, %s0 %t0 = shufflevector <4 x i32> %add, <4 x i32> %add, <4 x i32> %h0 = getelementptr <4 x i32>, ptr %dst, i32 0 store <4 x i32> %t0, ptr %h0, align 16 %t1 = shufflevector <4 x i32> %add, <4 x i32> %add, <4 x i32> %h1 = getelementptr <4 x i32>, ptr %dst, i32 1 store <4 x i32> %t1, ptr %h1, align 16 ret void } define <16 x i32> @test_1651256324(<16 x i32> %l0, <16 x i32> %l1, <16 x i32> %l6, <16 x i32> %l7) { ; CHECK-LABEL: @test_1651256324( ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i32> [[L0:%.*]], <16 x i32> [[L6:%.*]], <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i32> [[L1:%.*]], <16 x i32> [[L1]], <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> [[L1]], <16 x i32> [[L1]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[L7:%.*]], <16 x i32> [[L7]], <16 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> [[L6]], <16 x i32> [[L7]], <16 x i32> ; CHECK-NEXT: [[TMP5:%.*]] = add <16 x i32> [[TMP3]], [[TMP2]] ; CHECK-NEXT: [[TMP6:%.*]] = sub <16 x i32> [[TMP1]], [[TMP4]] ; CHECK-NEXT: [[T0:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: [[T1:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> [[TMP6]], <16 x i32> ; CHECK-NEXT: [[R:%.*]] = xor <16 x i32> [[T0]], [[T1]] ; CHECK-NEXT: ret <16 x i32> [[R]] ; %s0 = shufflevector <16 x i32> %l0, <16 x i32> %l6, <16 x i32> %s1 = shufflevector <16 x i32> %l1, <16 x i32> %l1, <16 x i32> %s2 = shufflevector <16 x i32> %l7, <16 x i32> %l7, <16 x i32> %s3 = shufflevector <16 x i32> %l6, <16 x i32> %l7, <16 x i32> %add = add <16 x i32> %s1, %s1 %sub = sub <16 x i32> %s0, %s3 %t0 = shufflevector <16 x i32> %add, <16 x i32> %sub, <16 x i32> %t1 = shufflevector <16 x i32> %sub, <16 x i32> %add, <16 x i32> %r = xor <16 x i32> %t0, %t1 ret <16 x i32> %r } define void @test_1652048214(ptr %src, ptr %dst) { ; CHECK-LABEL: @test_1652048214( ; CHECK-NEXT: [[G0:%.*]] = getelementptr <8 x i32>, ptr [[SRC:%.*]], i32 0 ; CHECK-NEXT: [[L0:%.*]] = load <8 x i32>, ptr [[G0]], align 32 ; CHECK-NEXT: [[G1:%.*]] = getelementptr <8 x i32>, ptr [[SRC]], i32 1 ; CHECK-NEXT: [[L1:%.*]] = load <8 x i32>, ptr [[G1]], align 32 ; CHECK-NEXT: [[S0:%.*]] = shufflevector <8 x i32> [[L1]], <8 x i32> [[L0]], <4 x i32> ; CHECK-NEXT: [[S1:%.*]] = shufflevector <8 x i32> [[L0]], <8 x i32> [[L0]], <4 x i32> ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[S1]], [[S1]] ; CHECK-NEXT: [[SUB:%.*]] = sub <4 x i32> [[S0]], [[S1]] ; CHECK-NEXT: [[T0:%.*]] = shufflevector <4 x i32> [[SUB]], <4 x i32> [[ADD]], <4 x i32> ; CHECK-NEXT: [[H0:%.*]] = getelementptr <4 x i32>, ptr [[DST:%.*]], i32 0 ; CHECK-NEXT: store <4 x i32> [[T0]], ptr [[H0]], align 16 ; CHECK-NEXT: ret void ; %g0 = getelementptr <8 x i32>, ptr %src, i32 0 %l0 = load <8 x i32>, ptr %g0, align 32 %g1 = getelementptr <8 x i32>, ptr %src, i32 1 %l1 = load <8 x i32>, ptr %g1, align 32 %s0 = shufflevector <8 x i32> %l1, <8 x i32> %l0, <4 x i32> %s1 = shufflevector <8 x i32> %l0, <8 x i32> %l0, <4 x i32> %add = add <4 x i32> %s1, %s1 %sub = sub <4 x i32> %s0, %s1 %t0 = shufflevector <4 x i32> %sub, <4 x i32> %add, <4 x i32> %h0 = getelementptr <4 x i32>, ptr %dst, i32 0 store <4 x i32> %t0, ptr %h0, align 16 ret void } define dso_local i32 @full(i8* nocapture noundef readonly %p1, i32 noundef %st1, i8* nocapture noundef readonly %p2, i32 noundef %st2) { ; CHECK-LABEL: @full( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[ST1:%.*]] to i64 ; CHECK-NEXT: [[IDX_EXT63:%.*]] = sext i32 [[ST2:%.*]] to i64 ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, ptr [[P1:%.*]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i8, ptr [[P2:%.*]], i64 4 ; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[IDX_EXT]] ; CHECK-NEXT: [[ADD_PTR64:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[IDX_EXT63]] ; CHECK-NEXT: [[ARRAYIDX3_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64]], i64 4 ; CHECK-NEXT: [[ADD_PTR_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR]], i64 [[IDX_EXT]] ; CHECK-NEXT: [[ADD_PTR64_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64]], i64 [[IDX_EXT63]] ; CHECK-NEXT: [[ARRAYIDX3_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR_1]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64_1]], i64 4 ; CHECK-NEXT: [[ADD_PTR_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR_1]], i64 [[IDX_EXT]] ; CHECK-NEXT: [[ADD_PTR64_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64_1]], i64 [[IDX_EXT63]] ; CHECK-NEXT: [[ARRAYIDX3_3:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR_2]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5_3:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64_2]], i64 4 ; CHECK-NEXT: [[TMP0:%.*]] = bitcast ptr [[P1]] to ptr ; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[TMP0]], align 1 ; CHECK-NEXT: [[TMP2:%.*]] = bitcast ptr [[P2]] to ptr ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i8>, ptr [[TMP2]], align 1 ; CHECK-NEXT: [[TMP4:%.*]] = bitcast ptr [[ARRAYIDX3]] to ptr ; CHECK-NEXT: [[TMP5:%.*]] = load <4 x i8>, ptr [[TMP4]], align 1 ; CHECK-NEXT: [[TMP6:%.*]] = bitcast ptr [[ARRAYIDX5]] to ptr ; CHECK-NEXT: [[TMP7:%.*]] = load <4 x i8>, ptr [[TMP6]], align 1 ; CHECK-NEXT: [[TMP8:%.*]] = bitcast ptr [[ADD_PTR]] to ptr ; CHECK-NEXT: [[TMP9:%.*]] = load <4 x i8>, ptr [[TMP8]], align 1 ; CHECK-NEXT: [[TMP10:%.*]] = bitcast ptr [[ADD_PTR64]] to ptr ; CHECK-NEXT: [[TMP11:%.*]] = load <4 x i8>, ptr [[TMP10]], align 1 ; CHECK-NEXT: [[TMP12:%.*]] = bitcast ptr [[ARRAYIDX3_1]] to ptr ; CHECK-NEXT: [[TMP13:%.*]] = load <4 x i8>, ptr [[TMP12]], align 1 ; CHECK-NEXT: [[TMP14:%.*]] = bitcast ptr [[ARRAYIDX5_1]] to ptr ; CHECK-NEXT: [[TMP15:%.*]] = load <4 x i8>, ptr [[TMP14]], align 1 ; CHECK-NEXT: [[TMP16:%.*]] = bitcast ptr [[ADD_PTR_1]] to ptr ; CHECK-NEXT: [[TMP17:%.*]] = load <4 x i8>, ptr [[TMP16]], align 1 ; CHECK-NEXT: [[TMP18:%.*]] = bitcast ptr [[ADD_PTR64_1]] to ptr ; CHECK-NEXT: [[TMP19:%.*]] = load <4 x i8>, ptr [[TMP18]], align 1 ; CHECK-NEXT: [[TMP20:%.*]] = bitcast ptr [[ARRAYIDX3_2]] to ptr ; CHECK-NEXT: [[TMP21:%.*]] = load <4 x i8>, ptr [[TMP20]], align 1 ; CHECK-NEXT: [[TMP22:%.*]] = bitcast ptr [[ARRAYIDX5_2]] to ptr ; CHECK-NEXT: [[TMP23:%.*]] = load <4 x i8>, ptr [[TMP22]], align 1 ; CHECK-NEXT: [[TMP24:%.*]] = bitcast ptr [[ADD_PTR_2]] to ptr ; CHECK-NEXT: [[TMP25:%.*]] = load <4 x i8>, ptr [[TMP24]], align 1 ; CHECK-NEXT: [[TMP26:%.*]] = shufflevector <4 x i8> [[TMP25]], <4 x i8> [[TMP17]], <16 x i32> ; CHECK-NEXT: [[TMP27:%.*]] = shufflevector <4 x i8> [[TMP9]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP28:%.*]] = shufflevector <16 x i8> [[TMP26]], <16 x i8> [[TMP27]], <16 x i32> ; CHECK-NEXT: [[TMP29:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP30:%.*]] = shufflevector <16 x i8> [[TMP28]], <16 x i8> [[TMP29]], <16 x i32> ; CHECK-NEXT: [[TMP31:%.*]] = zext <16 x i8> [[TMP30]] to <16 x i32> ; CHECK-NEXT: [[TMP32:%.*]] = bitcast ptr [[ADD_PTR64_2]] to ptr ; CHECK-NEXT: [[TMP33:%.*]] = load <4 x i8>, ptr [[TMP32]], align 1 ; CHECK-NEXT: [[TMP34:%.*]] = shufflevector <4 x i8> [[TMP33]], <4 x i8> [[TMP19]], <16 x i32> ; CHECK-NEXT: [[TMP35:%.*]] = shufflevector <4 x i8> [[TMP11]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP36:%.*]] = shufflevector <16 x i8> [[TMP34]], <16 x i8> [[TMP35]], <16 x i32> ; CHECK-NEXT: [[TMP37:%.*]] = shufflevector <4 x i8> [[TMP3]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP38:%.*]] = shufflevector <16 x i8> [[TMP36]], <16 x i8> [[TMP37]], <16 x i32> ; CHECK-NEXT: [[TMP39:%.*]] = zext <16 x i8> [[TMP38]] to <16 x i32> ; CHECK-NEXT: [[TMP40:%.*]] = sub nsw <16 x i32> [[TMP31]], [[TMP39]] ; CHECK-NEXT: [[TMP41:%.*]] = bitcast ptr [[ARRAYIDX3_3]] to ptr ; CHECK-NEXT: [[TMP42:%.*]] = load <4 x i8>, ptr [[TMP41]], align 1 ; CHECK-NEXT: [[TMP43:%.*]] = shufflevector <4 x i8> [[TMP42]], <4 x i8> [[TMP21]], <16 x i32> ; CHECK-NEXT: [[TMP44:%.*]] = shufflevector <4 x i8> [[TMP13]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP45:%.*]] = shufflevector <16 x i8> [[TMP43]], <16 x i8> [[TMP44]], <16 x i32> ; CHECK-NEXT: [[TMP46:%.*]] = shufflevector <4 x i8> [[TMP5]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP47:%.*]] = shufflevector <16 x i8> [[TMP45]], <16 x i8> [[TMP46]], <16 x i32> ; CHECK-NEXT: [[TMP48:%.*]] = zext <16 x i8> [[TMP47]] to <16 x i32> ; CHECK-NEXT: [[TMP49:%.*]] = bitcast ptr [[ARRAYIDX5_3]] to ptr ; CHECK-NEXT: [[TMP50:%.*]] = load <4 x i8>, ptr [[TMP49]], align 1 ; CHECK-NEXT: [[TMP51:%.*]] = shufflevector <4 x i8> [[TMP50]], <4 x i8> [[TMP23]], <16 x i32> ; CHECK-NEXT: [[TMP52:%.*]] = shufflevector <4 x i8> [[TMP15]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP53:%.*]] = shufflevector <16 x i8> [[TMP51]], <16 x i8> [[TMP52]], <16 x i32> ; CHECK-NEXT: [[TMP54:%.*]] = shufflevector <4 x i8> [[TMP7]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP55:%.*]] = shufflevector <16 x i8> [[TMP53]], <16 x i8> [[TMP54]], <16 x i32> ; CHECK-NEXT: [[TMP56:%.*]] = zext <16 x i8> [[TMP55]] to <16 x i32> ; CHECK-NEXT: [[TMP57:%.*]] = sub nsw <16 x i32> [[TMP48]], [[TMP56]] ; CHECK-NEXT: [[TMP58:%.*]] = shl nsw <16 x i32> [[TMP57]], ; CHECK-NEXT: [[TMP59:%.*]] = add nsw <16 x i32> [[TMP58]], [[TMP40]] ; CHECK-NEXT: [[TMP60:%.*]] = shufflevector <16 x i32> [[TMP59]], <16 x i32> [[TMP59]], <16 x i32> ; CHECK-NEXT: [[TMP61:%.*]] = shufflevector <16 x i32> [[TMP59]], <16 x i32> [[TMP59]], <16 x i32> ; CHECK-NEXT: [[TMP62:%.*]] = shufflevector <16 x i32> [[TMP59]], <16 x i32> poison, <16 x i32> ; CHECK-NEXT: [[TMP63:%.*]] = shufflevector <16 x i32> [[TMP59]], <16 x i32> poison, <16 x i32> ; CHECK-NEXT: [[TMP64:%.*]] = add nsw <16 x i32> [[TMP61]], [[TMP63]] ; CHECK-NEXT: [[TMP65:%.*]] = sub nsw <16 x i32> [[TMP60]], [[TMP62]] ; CHECK-NEXT: [[TMP66:%.*]] = shufflevector <16 x i32> [[TMP64]], <16 x i32> [[TMP65]], <16 x i32> ; CHECK-NEXT: [[TMP67:%.*]] = shufflevector <16 x i32> [[TMP64]], <16 x i32> [[TMP65]], <16 x i32> ; CHECK-NEXT: [[TMP68:%.*]] = shufflevector <16 x i32> [[TMP64]], <16 x i32> [[TMP65]], <16 x i32> ; CHECK-NEXT: [[TMP69:%.*]] = shufflevector <16 x i32> [[TMP64]], <16 x i32> [[TMP65]], <16 x i32> ; CHECK-NEXT: [[TMP70:%.*]] = add nsw <16 x i32> [[TMP67]], [[TMP69]] ; CHECK-NEXT: [[TMP71:%.*]] = sub nsw <16 x i32> [[TMP66]], [[TMP68]] ; CHECK-NEXT: [[TMP72:%.*]] = shufflevector <16 x i32> [[TMP70]], <16 x i32> [[TMP71]], <16 x i32> ; CHECK-NEXT: [[TMP73:%.*]] = shufflevector <16 x i32> [[TMP70]], <16 x i32> [[TMP71]], <16 x i32> ; CHECK-NEXT: [[TMP74:%.*]] = shufflevector <16 x i32> [[TMP70]], <16 x i32> [[TMP71]], <16 x i32> ; CHECK-NEXT: [[TMP75:%.*]] = shufflevector <16 x i32> [[TMP70]], <16 x i32> [[TMP71]], <16 x i32> ; CHECK-NEXT: [[TMP76:%.*]] = add nsw <16 x i32> [[TMP73]], [[TMP75]] ; CHECK-NEXT: [[TMP77:%.*]] = sub nsw <16 x i32> [[TMP72]], [[TMP74]] ; CHECK-NEXT: [[TMP78:%.*]] = shufflevector <16 x i32> [[TMP76]], <16 x i32> [[TMP77]], <16 x i32> ; CHECK-NEXT: [[TMP79:%.*]] = shufflevector <16 x i32> [[TMP76]], <16 x i32> [[TMP77]], <16 x i32> ; CHECK-NEXT: [[TMP80:%.*]] = shufflevector <16 x i32> [[TMP76]], <16 x i32> [[TMP77]], <16 x i32> ; CHECK-NEXT: [[TMP81:%.*]] = shufflevector <16 x i32> [[TMP76]], <16 x i32> [[TMP77]], <16 x i32> ; CHECK-NEXT: [[TMP82:%.*]] = add nsw <16 x i32> [[TMP79]], [[TMP81]] ; CHECK-NEXT: [[TMP83:%.*]] = sub nsw <16 x i32> [[TMP78]], [[TMP80]] ; CHECK-NEXT: [[TMP84:%.*]] = shufflevector <16 x i32> [[TMP82]], <16 x i32> [[TMP83]], <16 x i32> ; CHECK-NEXT: [[TMP85:%.*]] = lshr <16 x i32> [[TMP84]], ; CHECK-NEXT: [[TMP86:%.*]] = and <16 x i32> [[TMP85]], ; CHECK-NEXT: [[TMP87:%.*]] = mul nuw <16 x i32> [[TMP86]], ; CHECK-NEXT: [[TMP88:%.*]] = add <16 x i32> [[TMP87]], [[TMP84]] ; CHECK-NEXT: [[TMP89:%.*]] = xor <16 x i32> [[TMP88]], [[TMP87]] ; CHECK-NEXT: [[TMP90:%.*]] = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> [[TMP89]]) ; CHECK-NEXT: [[CONV118:%.*]] = and i32 [[TMP90]], 65535 ; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[TMP90]], 16 ; CHECK-NEXT: [[ADD119:%.*]] = add nuw nsw i32 [[CONV118]], [[SHR]] ; CHECK-NEXT: [[SHR120:%.*]] = lshr i32 [[ADD119]], 1 ; CHECK-NEXT: ret i32 [[SHR120]] ; entry: %idx.ext = sext i32 %st1 to i64 %idx.ext63 = sext i32 %st2 to i64 %arrayidx3 = getelementptr inbounds i8, i8* %p1, i64 4 %arrayidx5 = getelementptr inbounds i8, i8* %p2, i64 4 %add.ptr = getelementptr inbounds i8, i8* %p1, i64 %idx.ext %add.ptr64 = getelementptr inbounds i8, i8* %p2, i64 %idx.ext63 %arrayidx3.1 = getelementptr inbounds i8, i8* %add.ptr, i64 4 %arrayidx5.1 = getelementptr inbounds i8, i8* %add.ptr64, i64 4 %add.ptr.1 = getelementptr inbounds i8, i8* %add.ptr, i64 %idx.ext %add.ptr64.1 = getelementptr inbounds i8, i8* %add.ptr64, i64 %idx.ext63 %arrayidx3.2 = getelementptr inbounds i8, i8* %add.ptr.1, i64 4 %arrayidx5.2 = getelementptr inbounds i8, i8* %add.ptr64.1, i64 4 %add.ptr.2 = getelementptr inbounds i8, i8* %add.ptr.1, i64 %idx.ext %add.ptr64.2 = getelementptr inbounds i8, i8* %add.ptr64.1, i64 %idx.ext63 %arrayidx3.3 = getelementptr inbounds i8, i8* %add.ptr.2, i64 4 %arrayidx5.3 = getelementptr inbounds i8, i8* %add.ptr64.2, i64 4 %0 = bitcast i8* %p1 to <4 x i8>* %1 = load <4 x i8>, <4 x i8>* %0, align 1 %2 = bitcast i8* %p2 to <4 x i8>* %3 = load <4 x i8>, <4 x i8>* %2, align 1 %4 = bitcast i8* %arrayidx3 to <4 x i8>* %5 = load <4 x i8>, <4 x i8>* %4, align 1 %6 = bitcast i8* %arrayidx5 to <4 x i8>* %7 = load <4 x i8>, <4 x i8>* %6, align 1 %8 = bitcast i8* %add.ptr to <4 x i8>* %9 = load <4 x i8>, <4 x i8>* %8, align 1 %10 = bitcast i8* %add.ptr64 to <4 x i8>* %11 = load <4 x i8>, <4 x i8>* %10, align 1 %12 = bitcast i8* %arrayidx3.1 to <4 x i8>* %13 = load <4 x i8>, <4 x i8>* %12, align 1 %14 = bitcast i8* %arrayidx5.1 to <4 x i8>* %15 = load <4 x i8>, <4 x i8>* %14, align 1 %16 = bitcast i8* %add.ptr.1 to <4 x i8>* %17 = load <4 x i8>, <4 x i8>* %16, align 1 %18 = bitcast i8* %add.ptr64.1 to <4 x i8>* %19 = load <4 x i8>, <4 x i8>* %18, align 1 %20 = bitcast i8* %arrayidx3.2 to <4 x i8>* %21 = load <4 x i8>, <4 x i8>* %20, align 1 %22 = bitcast i8* %arrayidx5.2 to <4 x i8>* %23 = load <4 x i8>, <4 x i8>* %22, align 1 %24 = bitcast i8* %add.ptr.2 to <4 x i8>* %25 = load <4 x i8>, <4 x i8>* %24, align 1 %26 = shufflevector <4 x i8> %25, <4 x i8> %17, <16 x i32> %27 = shufflevector <4 x i8> %9, <4 x i8> poison, <16 x i32> %28 = shufflevector <16 x i8> %26, <16 x i8> %27, <16 x i32> %29 = shufflevector <4 x i8> %1, <4 x i8> poison, <16 x i32> %30 = shufflevector <16 x i8> %28, <16 x i8> %29, <16 x i32> %31 = zext <16 x i8> %30 to <16 x i32> %32 = bitcast i8* %add.ptr64.2 to <4 x i8>* %33 = load <4 x i8>, <4 x i8>* %32, align 1 %34 = shufflevector <4 x i8> %33, <4 x i8> %19, <16 x i32> %35 = shufflevector <4 x i8> %11, <4 x i8> poison, <16 x i32> %36 = shufflevector <16 x i8> %34, <16 x i8> %35, <16 x i32> %37 = shufflevector <4 x i8> %3, <4 x i8> poison, <16 x i32> %38 = shufflevector <16 x i8> %36, <16 x i8> %37, <16 x i32> %39 = zext <16 x i8> %38 to <16 x i32> %40 = sub nsw <16 x i32> %31, %39 %41 = bitcast i8* %arrayidx3.3 to <4 x i8>* %42 = load <4 x i8>, <4 x i8>* %41, align 1 %43 = shufflevector <4 x i8> %42, <4 x i8> %21, <16 x i32> %44 = shufflevector <4 x i8> %13, <4 x i8> poison, <16 x i32> %45 = shufflevector <16 x i8> %43, <16 x i8> %44, <16 x i32> %46 = shufflevector <4 x i8> %5, <4 x i8> poison, <16 x i32> %47 = shufflevector <16 x i8> %45, <16 x i8> %46, <16 x i32> %48 = zext <16 x i8> %47 to <16 x i32> %49 = bitcast i8* %arrayidx5.3 to <4 x i8>* %50 = load <4 x i8>, <4 x i8>* %49, align 1 %51 = shufflevector <4 x i8> %50, <4 x i8> %23, <16 x i32> %52 = shufflevector <4 x i8> %15, <4 x i8> poison, <16 x i32> %53 = shufflevector <16 x i8> %51, <16 x i8> %52, <16 x i32> %54 = shufflevector <4 x i8> %7, <4 x i8> poison, <16 x i32> %55 = shufflevector <16 x i8> %53, <16 x i8> %54, <16 x i32> %56 = zext <16 x i8> %55 to <16 x i32> %57 = sub nsw <16 x i32> %48, %56 %58 = shl nsw <16 x i32> %57, %59 = add nsw <16 x i32> %58, %40 %reorder = shufflevector <16 x i32> %59, <16 x i32> poison, <16 x i32> %60 = add nsw <16 x i32> %59, %reorder %61 = sub nsw <16 x i32> %59, %reorder %62 = shufflevector <16 x i32> %60, <16 x i32> %61, <16 x i32> %reorder1 = shufflevector <16 x i32> %60, <16 x i32> %61, <16 x i32> %63 = add nsw <16 x i32> %62, %reorder1 %64 = sub nsw <16 x i32> %62, %reorder1 %65 = shufflevector <16 x i32> %63, <16 x i32> %64, <16 x i32> %reorder2 = shufflevector <16 x i32> %63, <16 x i32> %64, <16 x i32> %66 = add nsw <16 x i32> %65, %reorder2 %67 = sub nsw <16 x i32> %65, %reorder2 %68 = shufflevector <16 x i32> %66, <16 x i32> %67, <16 x i32> %reorder3 = shufflevector <16 x i32> %66, <16 x i32> %67, <16 x i32> %69 = add nsw <16 x i32> %68, %reorder3 %70 = sub nsw <16 x i32> %68, %reorder3 %71 = shufflevector <16 x i32> %69, <16 x i32> %70, <16 x i32> %72 = lshr <16 x i32> %71, %73 = and <16 x i32> %72, %74 = mul nuw <16 x i32> %73, %75 = add <16 x i32> %74, %71 %76 = xor <16 x i32> %75, %74 %77 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %76) %conv118 = and i32 %77, 65535 %shr = lshr i32 %77, 16 %add119 = add nuw nsw i32 %conv118, %shr %shr120 = lshr i32 %add119, 1 ret i32 %shr120 } define i32 @full_reorder(ptr nocapture noundef readonly %pix1, i32 noundef %i_pix1, ptr nocapture noundef readonly %pix2, i32 noundef %i_pix2) { ; CHECK-LABEL: @full_reorder( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[IDX_EXT:%.*]] = sext i32 [[I_PIX1:%.*]] to i64 ; CHECK-NEXT: [[IDX_EXT63:%.*]] = sext i32 [[I_PIX2:%.*]] to i64 ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8, ptr [[PIX1:%.*]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i8, ptr [[PIX2:%.*]], i64 4 ; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[PIX1]], i64 [[IDX_EXT]] ; CHECK-NEXT: [[ADD_PTR64:%.*]] = getelementptr inbounds i8, ptr [[PIX2]], i64 [[IDX_EXT63]] ; CHECK-NEXT: [[ARRAYIDX3_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64]], i64 4 ; CHECK-NEXT: [[ADD_PTR_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR]], i64 [[IDX_EXT]] ; CHECK-NEXT: [[ADD_PTR64_1:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64]], i64 [[IDX_EXT63]] ; CHECK-NEXT: [[ARRAYIDX3_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR_1]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64_1]], i64 4 ; CHECK-NEXT: [[ADD_PTR_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR_1]], i64 [[IDX_EXT]] ; CHECK-NEXT: [[ADD_PTR64_2:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64_1]], i64 [[IDX_EXT63]] ; CHECK-NEXT: [[ARRAYIDX3_3:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR_2]], i64 4 ; CHECK-NEXT: [[ARRAYIDX5_3:%.*]] = getelementptr inbounds i8, ptr [[ADD_PTR64_2]], i64 4 ; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i8>, ptr [[PIX1]], align 1 ; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[PIX2]], align 1 ; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[ARRAYIDX3]], align 1 ; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i8>, ptr [[ARRAYIDX5]], align 1 ; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i8>, ptr [[ADD_PTR]], align 1 ; CHECK-NEXT: [[TMP5:%.*]] = load <4 x i8>, ptr [[ADD_PTR64]], align 1 ; CHECK-NEXT: [[TMP6:%.*]] = load <4 x i8>, ptr [[ARRAYIDX3_1]], align 1 ; CHECK-NEXT: [[TMP7:%.*]] = load <4 x i8>, ptr [[ARRAYIDX5_1]], align 1 ; CHECK-NEXT: [[TMP8:%.*]] = load <4 x i8>, ptr [[ADD_PTR_1]], align 1 ; CHECK-NEXT: [[TMP9:%.*]] = load <4 x i8>, ptr [[ADD_PTR64_1]], align 1 ; CHECK-NEXT: [[TMP10:%.*]] = load <4 x i8>, ptr [[ARRAYIDX3_2]], align 1 ; CHECK-NEXT: [[TMP11:%.*]] = load <4 x i8>, ptr [[ARRAYIDX5_2]], align 1 ; CHECK-NEXT: [[TMP12:%.*]] = load <4 x i8>, ptr [[ADD_PTR_2]], align 1 ; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <4 x i8> [[TMP12]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP14:%.*]] = shufflevector <4 x i8> [[TMP8]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <16 x i8> [[TMP13]], <16 x i8> [[TMP14]], <16 x i32> ; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <4 x i8> [[TMP4]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP17:%.*]] = shufflevector <16 x i8> [[TMP15]], <16 x i8> [[TMP16]], <16 x i32> ; CHECK-NEXT: [[TMP18:%.*]] = shufflevector <4 x i8> [[TMP0]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP19:%.*]] = shufflevector <16 x i8> [[TMP17]], <16 x i8> [[TMP18]], <16 x i32> ; CHECK-NEXT: [[TMP20:%.*]] = zext <16 x i8> [[TMP19]] to <16 x i32> ; CHECK-NEXT: [[TMP21:%.*]] = load <4 x i8>, ptr [[ADD_PTR64_2]], align 1 ; CHECK-NEXT: [[TMP22:%.*]] = shufflevector <4 x i8> [[TMP21]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP23:%.*]] = shufflevector <4 x i8> [[TMP9]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP24:%.*]] = shufflevector <16 x i8> [[TMP22]], <16 x i8> [[TMP23]], <16 x i32> ; CHECK-NEXT: [[TMP25:%.*]] = shufflevector <4 x i8> [[TMP5]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP26:%.*]] = shufflevector <16 x i8> [[TMP24]], <16 x i8> [[TMP25]], <16 x i32> ; CHECK-NEXT: [[TMP27:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP28:%.*]] = shufflevector <16 x i8> [[TMP26]], <16 x i8> [[TMP27]], <16 x i32> ; CHECK-NEXT: [[TMP29:%.*]] = zext <16 x i8> [[TMP28]] to <16 x i32> ; CHECK-NEXT: [[TMP30:%.*]] = sub nsw <16 x i32> [[TMP20]], [[TMP29]] ; CHECK-NEXT: [[TMP31:%.*]] = load <4 x i8>, ptr [[ARRAYIDX3_3]], align 1 ; CHECK-NEXT: [[TMP32:%.*]] = shufflevector <4 x i8> [[TMP31]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP33:%.*]] = shufflevector <4 x i8> [[TMP10]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP34:%.*]] = shufflevector <16 x i8> [[TMP32]], <16 x i8> [[TMP33]], <16 x i32> ; CHECK-NEXT: [[TMP35:%.*]] = shufflevector <4 x i8> [[TMP6]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP36:%.*]] = shufflevector <16 x i8> [[TMP34]], <16 x i8> [[TMP35]], <16 x i32> ; CHECK-NEXT: [[TMP37:%.*]] = shufflevector <4 x i8> [[TMP2]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP38:%.*]] = shufflevector <16 x i8> [[TMP36]], <16 x i8> [[TMP37]], <16 x i32> ; CHECK-NEXT: [[TMP39:%.*]] = zext <16 x i8> [[TMP38]] to <16 x i32> ; CHECK-NEXT: [[TMP40:%.*]] = load <4 x i8>, ptr [[ARRAYIDX5_3]], align 1 ; CHECK-NEXT: [[TMP41:%.*]] = shufflevector <4 x i8> [[TMP40]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP42:%.*]] = shufflevector <4 x i8> [[TMP11]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP43:%.*]] = shufflevector <16 x i8> [[TMP41]], <16 x i8> [[TMP42]], <16 x i32> ; CHECK-NEXT: [[TMP44:%.*]] = shufflevector <4 x i8> [[TMP7]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP45:%.*]] = shufflevector <16 x i8> [[TMP43]], <16 x i8> [[TMP44]], <16 x i32> ; CHECK-NEXT: [[TMP46:%.*]] = shufflevector <4 x i8> [[TMP3]], <4 x i8> poison, <16 x i32> ; CHECK-NEXT: [[TMP47:%.*]] = shufflevector <16 x i8> [[TMP45]], <16 x i8> [[TMP46]], <16 x i32> ; CHECK-NEXT: [[TMP48:%.*]] = zext <16 x i8> [[TMP47]] to <16 x i32> ; CHECK-NEXT: [[TMP49:%.*]] = sub nsw <16 x i32> [[TMP39]], [[TMP48]] ; CHECK-NEXT: [[TMP50:%.*]] = shl nsw <16 x i32> [[TMP49]], ; CHECK-NEXT: [[TMP51:%.*]] = add nsw <16 x i32> [[TMP50]], [[TMP30]] ; CHECK-NEXT: [[TMP52:%.*]] = shufflevector <16 x i32> [[TMP51]], <16 x i32> [[TMP51]], <16 x i32> ; CHECK-NEXT: [[TMP53:%.*]] = shufflevector <16 x i32> [[TMP51]], <16 x i32> [[TMP51]], <16 x i32> ; CHECK-NEXT: [[TMP54:%.*]] = shufflevector <16 x i32> [[TMP51]], <16 x i32> poison, <16 x i32> ; CHECK-NEXT: [[TMP55:%.*]] = shufflevector <16 x i32> [[TMP51]], <16 x i32> poison, <16 x i32> ; CHECK-NEXT: [[TMP56:%.*]] = add nsw <16 x i32> [[TMP53]], [[TMP55]] ; CHECK-NEXT: [[TMP57:%.*]] = sub nsw <16 x i32> [[TMP52]], [[TMP54]] ; CHECK-NEXT: [[TMP58:%.*]] = shufflevector <16 x i32> [[TMP56]], <16 x i32> [[TMP57]], <16 x i32> ; CHECK-NEXT: [[TMP59:%.*]] = shufflevector <16 x i32> [[TMP56]], <16 x i32> [[TMP57]], <16 x i32> ; CHECK-NEXT: [[TMP60:%.*]] = shufflevector <16 x i32> [[TMP56]], <16 x i32> [[TMP57]], <16 x i32> ; CHECK-NEXT: [[TMP61:%.*]] = shufflevector <16 x i32> [[TMP56]], <16 x i32> [[TMP57]], <16 x i32> ; CHECK-NEXT: [[TMP62:%.*]] = add nsw <16 x i32> [[TMP59]], [[TMP61]] ; CHECK-NEXT: [[TMP63:%.*]] = sub nsw <16 x i32> [[TMP58]], [[TMP60]] ; CHECK-NEXT: [[TMP64:%.*]] = shufflevector <16 x i32> [[TMP62]], <16 x i32> [[TMP63]], <16 x i32> ; CHECK-NEXT: [[TMP65:%.*]] = shufflevector <16 x i32> [[TMP62]], <16 x i32> [[TMP63]], <16 x i32> ; CHECK-NEXT: [[TMP66:%.*]] = shufflevector <16 x i32> [[TMP62]], <16 x i32> [[TMP63]], <16 x i32> ; CHECK-NEXT: [[TMP67:%.*]] = shufflevector <16 x i32> [[TMP62]], <16 x i32> [[TMP63]], <16 x i32> ; CHECK-NEXT: [[TMP68:%.*]] = add nsw <16 x i32> [[TMP65]], [[TMP67]] ; CHECK-NEXT: [[TMP69:%.*]] = sub nsw <16 x i32> [[TMP64]], [[TMP66]] ; CHECK-NEXT: [[TMP70:%.*]] = shufflevector <16 x i32> [[TMP68]], <16 x i32> [[TMP69]], <16 x i32> ; CHECK-NEXT: [[TMP71:%.*]] = shufflevector <16 x i32> [[TMP68]], <16 x i32> [[TMP69]], <16 x i32> ; CHECK-NEXT: [[TMP72:%.*]] = shufflevector <16 x i32> [[TMP68]], <16 x i32> [[TMP69]], <16 x i32> ; CHECK-NEXT: [[TMP73:%.*]] = shufflevector <16 x i32> [[TMP68]], <16 x i32> [[TMP69]], <16 x i32> ; CHECK-NEXT: [[TMP74:%.*]] = add nsw <16 x i32> [[TMP71]], [[TMP73]] ; CHECK-NEXT: [[TMP75:%.*]] = sub nsw <16 x i32> [[TMP70]], [[TMP72]] ; CHECK-NEXT: [[TMP76:%.*]] = shufflevector <16 x i32> [[TMP74]], <16 x i32> [[TMP75]], <16 x i32> ; CHECK-NEXT: [[TMP77:%.*]] = lshr <16 x i32> [[TMP76]], ; CHECK-NEXT: [[TMP78:%.*]] = and <16 x i32> [[TMP77]], ; CHECK-NEXT: [[TMP79:%.*]] = mul nuw <16 x i32> [[TMP78]], ; CHECK-NEXT: [[TMP80:%.*]] = add <16 x i32> [[TMP79]], [[TMP76]] ; CHECK-NEXT: [[TMP81:%.*]] = xor <16 x i32> [[TMP80]], [[TMP79]] ; CHECK-NEXT: [[TMP82:%.*]] = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> [[TMP81]]) ; CHECK-NEXT: [[CONV118:%.*]] = and i32 [[TMP82]], 65535 ; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[TMP82]], 16 ; CHECK-NEXT: [[ADD119:%.*]] = add nuw nsw i32 [[CONV118]], [[SHR]] ; CHECK-NEXT: [[SHR120:%.*]] = lshr i32 [[ADD119]], 1 ; CHECK-NEXT: ret i32 [[SHR120]] ; entry: %idx.ext = sext i32 %i_pix1 to i64 %idx.ext63 = sext i32 %i_pix2 to i64 %arrayidx3 = getelementptr inbounds i8, ptr %pix1, i64 4 %arrayidx5 = getelementptr inbounds i8, ptr %pix2, i64 4 %add.ptr = getelementptr inbounds i8, ptr %pix1, i64 %idx.ext %add.ptr64 = getelementptr inbounds i8, ptr %pix2, i64 %idx.ext63 %arrayidx3.1 = getelementptr inbounds i8, ptr %add.ptr, i64 4 %arrayidx5.1 = getelementptr inbounds i8, ptr %add.ptr64, i64 4 %add.ptr.1 = getelementptr inbounds i8, ptr %add.ptr, i64 %idx.ext %add.ptr64.1 = getelementptr inbounds i8, ptr %add.ptr64, i64 %idx.ext63 %arrayidx3.2 = getelementptr inbounds i8, ptr %add.ptr.1, i64 4 %arrayidx5.2 = getelementptr inbounds i8, ptr %add.ptr64.1, i64 4 %add.ptr.2 = getelementptr inbounds i8, ptr %add.ptr.1, i64 %idx.ext %add.ptr64.2 = getelementptr inbounds i8, ptr %add.ptr64.1, i64 %idx.ext63 %arrayidx3.3 = getelementptr inbounds i8, ptr %add.ptr.2, i64 4 %arrayidx5.3 = getelementptr inbounds i8, ptr %add.ptr64.2, i64 4 %0 = load <4 x i8>, ptr %pix1, align 1 %1 = load <4 x i8>, ptr %pix2, align 1 %2 = load <4 x i8>, ptr %arrayidx3, align 1 %3 = load <4 x i8>, ptr %arrayidx5, align 1 %4 = load <4 x i8>, ptr %add.ptr, align 1 %5 = load <4 x i8>, ptr %add.ptr64, align 1 %6 = load <4 x i8>, ptr %arrayidx3.1, align 1 %7 = load <4 x i8>, ptr %arrayidx5.1, align 1 %8 = load <4 x i8>, ptr %add.ptr.1, align 1 %9 = load <4 x i8>, ptr %add.ptr64.1, align 1 %10 = load <4 x i8>, ptr %arrayidx3.2, align 1 %11 = load <4 x i8>, ptr %arrayidx5.2, align 1 %12 = load <4 x i8>, ptr %add.ptr.2, align 1 %13 = shufflevector <4 x i8> %12, <4 x i8> poison, <16 x i32> %14 = shufflevector <4 x i8> %8, <4 x i8> poison, <16 x i32> %15 = shufflevector <16 x i8> %13, <16 x i8> %14, <16 x i32> %16 = shufflevector <4 x i8> %4, <4 x i8> poison, <16 x i32> %17 = shufflevector <16 x i8> %15, <16 x i8> %16, <16 x i32> %18 = shufflevector <4 x i8> %0, <4 x i8> poison, <16 x i32> %19 = shufflevector <16 x i8> %17, <16 x i8> %18, <16 x i32> %20 = zext <16 x i8> %19 to <16 x i32> %21 = load <4 x i8>, ptr %add.ptr64.2, align 1 %22 = shufflevector <4 x i8> %21, <4 x i8> poison, <16 x i32> %23 = shufflevector <4 x i8> %9, <4 x i8> poison, <16 x i32> %24 = shufflevector <16 x i8> %22, <16 x i8> %23, <16 x i32> %25 = shufflevector <4 x i8> %5, <4 x i8> poison, <16 x i32> %26 = shufflevector <16 x i8> %24, <16 x i8> %25, <16 x i32> %27 = shufflevector <4 x i8> %1, <4 x i8> poison, <16 x i32> %28 = shufflevector <16 x i8> %26, <16 x i8> %27, <16 x i32> %29 = zext <16 x i8> %28 to <16 x i32> %30 = sub nsw <16 x i32> %20, %29 %31 = load <4 x i8>, ptr %arrayidx3.3, align 1 %32 = shufflevector <4 x i8> %31, <4 x i8> poison, <16 x i32> %33 = shufflevector <4 x i8> %10, <4 x i8> poison, <16 x i32> %34 = shufflevector <16 x i8> %32, <16 x i8> %33, <16 x i32> %35 = shufflevector <4 x i8> %6, <4 x i8> poison, <16 x i32> %36 = shufflevector <16 x i8> %34, <16 x i8> %35, <16 x i32> %37 = shufflevector <4 x i8> %2, <4 x i8> poison, <16 x i32> %38 = shufflevector <16 x i8> %36, <16 x i8> %37, <16 x i32> %39 = zext <16 x i8> %38 to <16 x i32> %40 = load <4 x i8>, ptr %arrayidx5.3, align 1 %41 = shufflevector <4 x i8> %40, <4 x i8> poison, <16 x i32> %42 = shufflevector <4 x i8> %11, <4 x i8> poison, <16 x i32> %43 = shufflevector <16 x i8> %41, <16 x i8> %42, <16 x i32> %44 = shufflevector <4 x i8> %7, <4 x i8> poison, <16 x i32> %45 = shufflevector <16 x i8> %43, <16 x i8> %44, <16 x i32> %46 = shufflevector <4 x i8> %3, <4 x i8> poison, <16 x i32> %47 = shufflevector <16 x i8> %45, <16 x i8> %46, <16 x i32> %48 = zext <16 x i8> %47 to <16 x i32> %49 = sub nsw <16 x i32> %39, %48 %50 = shl nsw <16 x i32> %49, %51 = add nsw <16 x i32> %50, %30 %reorder = shufflevector <16 x i32> %51, <16 x i32> poison, <16 x i32> %52 = add nsw <16 x i32> %51, %reorder %53 = sub nsw <16 x i32> %51, %reorder %54 = shufflevector <16 x i32> %52, <16 x i32> %53, <16 x i32> %reorder191 = shufflevector <16 x i32> %52, <16 x i32> %53, <16 x i32> %55 = add nsw <16 x i32> %54, %reorder191 %56 = sub nsw <16 x i32> %54, %reorder191 %57 = shufflevector <16 x i32> %55, <16 x i32> %56, <16 x i32> %reorder192 = shufflevector <16 x i32> %55, <16 x i32> %56, <16 x i32> %58 = add nsw <16 x i32> %57, %reorder192 %59 = sub nsw <16 x i32> %57, %reorder192 %60 = shufflevector <16 x i32> %58, <16 x i32> %59, <16 x i32> %reorder193 = shufflevector <16 x i32> %58, <16 x i32> %59, <16 x i32> %61 = add nsw <16 x i32> %60, %reorder193 %62 = sub nsw <16 x i32> %60, %reorder193 %63 = shufflevector <16 x i32> %61, <16 x i32> %62, <16 x i32> %64 = lshr <16 x i32> %63, %65 = and <16 x i32> %64, %66 = mul nuw <16 x i32> %65, %67 = add <16 x i32> %66, %63 %68 = xor <16 x i32> %67, %66 %69 = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %68) %conv118 = and i32 %69, 65535 %shr = lshr i32 %69, 16 %add119 = add nuw nsw i32 %conv118, %shr %shr120 = lshr i32 %add119, 1 ret i32 %shr120 } define void @manyundefs() ; CHECK-LABEL: @manyundefs( ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x float> undef, float undef, i64 1 ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x float> undef, float undef, i64 1 ; CHECK-NEXT: [[TMP3:%.*]] = fadd <2 x float> [[TMP1]], [[TMP2]] ; CHECK-NEXT: [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP2]] ; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x float> [[TMP3]], <2 x float> [[TMP4]], <2 x i32> ; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x float> [[TMP4]], <2 x float> poison, <2 x i32> ; CHECK-NEXT: ret void ; unnamed_addr #0 align 2 { %1 = insertelement <2 x float> undef, float undef, i64 1 %2 = insertelement <2 x float> undef, float undef, i64 1 %3 = fadd <2 x float> %1, %2 %4 = fmul <2 x float> %1, %2 %5 = shufflevector <2 x float> %3, <2 x float> %4, <2 x i32> %6 = shufflevector <2 x float> %4, <2 x float> poison, <2 x i32> ret void } define void @manyundefs2() ; CHECK-LABEL: @manyundefs2( ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x float> undef, float undef, i64 1 ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x float> undef, float undef, i64 1 ; CHECK-NEXT: [[TMP3:%.*]] = fadd <2 x float> [[TMP1]], [[TMP2]] ; CHECK-NEXT: [[TMP4:%.*]] = fmul <2 x float> [[TMP1]], [[TMP2]] ; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x float> [[TMP3]], <2 x float> [[TMP4]], <2 x i32> ; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x float> [[TMP4]], <2 x float> [[TMP3]], <2 x i32> ; CHECK-NEXT: ret void ; unnamed_addr #0 align 2 { %1 = insertelement <2 x float> undef, float undef, i64 1 %2 = insertelement <2 x float> undef, float undef, i64 1 %3 = fadd <2 x float> %1, %2 %4 = fmul <2 x float> %1, %2 %5 = shufflevector <2 x float> %3, <2 x float> %4, <2 x i32> %6 = shufflevector <2 x float> %4, <2 x float> %3, <2 x i32> ret void } define <16 x i32> @testoutofbounds(<16 x i32> %x, <16 x i32> %y) { ; CHECK-LABEL: @testoutofbounds( ; CHECK-NEXT: [[S1:%.*]] = shufflevector <16 x i32> [[X:%.*]], <16 x i32> [[Y:%.*]], <16 x i32> ; CHECK-NEXT: [[S2:%.*]] = shufflevector <16 x i32> [[X]], <16 x i32> [[Y]], <16 x i32> ; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]] ; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> ; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[S3]], <16 x i32> poison, <16 x i32> ; CHECK-NEXT: [[ADD:%.*]] = add <16 x i32> [[S3]], [[S4]] ; CHECK-NEXT: ret <16 x i32> [[ADD]] ; %s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %s2 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> %a = add nsw <16 x i32> %s1, %s2 %b = sub nsw <16 x i32> %s1, %s2 %s3 = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> %s4 = shufflevector <16 x i32> %s3, <16 x i32> poison, <16 x i32> %add = add <16 x i32> %s3, %s4 ret <16 x i32> %add } declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>)