From c326c1c58217f67c13a5b9bb16873a78518b18da Mon Sep 17 00:00:00 2001 From: Dinar Temirbulatov Date: Thu, 29 Mar 2018 18:57:03 +0000 Subject: [PATCH] [SLPVectorizer] Add tests related to PR30787, NFCI. llvm-svn: 328813 --- .../SLPVectorizer/SystemZ/pr34619.ll | 52 ++++++ .../Transforms/SLPVectorizer/X86/partail.ll | 75 +++++++++ .../Transforms/SLPVectorizer/X86/pr35497.ll | 105 ++++++++++++ .../Transforms/SLPVectorizer/X86/resched.ll | 158 ++++++++++++++++++ 4 files changed, 390 insertions(+) create mode 100644 llvm/test/Transforms/SLPVectorizer/SystemZ/pr34619.ll create mode 100644 llvm/test/Transforms/SLPVectorizer/X86/partail.ll create mode 100644 llvm/test/Transforms/SLPVectorizer/X86/pr35497.ll create mode 100644 llvm/test/Transforms/SLPVectorizer/X86/resched.ll diff --git a/llvm/test/Transforms/SLPVectorizer/SystemZ/pr34619.ll b/llvm/test/Transforms/SLPVectorizer/SystemZ/pr34619.ll new file mode 100644 index 000000000000..3855834d8a13 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/SystemZ/pr34619.ll @@ -0,0 +1,52 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -mtriple=systemz-unknown -mcpu=z13 -slp-vectorizer -S < %s | FileCheck %s + +@bar = external global [4 x [4 x i32]], align 4 +@dct_luma = external global [4 x [4 x i32]], align 4 + +define void @foo() local_unnamed_addr { +; CHECK-LABEL: @foo( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[ADD277:%.*]] = add nsw i32 undef, undef +; CHECK-NEXT: store i32 [[ADD277]], i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 1), align 4 +; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 0), align 4 +; CHECK-NEXT: [[ARRAYIDX372:%.*]] = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 0 +; CHECK-NEXT: [[ARRAYIDX372_1:%.*]] = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 1 +; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 2), align 4 +; CHECK-NEXT: [[ARRAYIDX372_2:%.*]] = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 2 +; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 3), align 4 +; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x i32> undef, i32 [[TMP0]], i32 0 +; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> [[TMP3]], i32 [[ADD277]], i32 1 +; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i32> [[TMP4]], i32 [[TMP1]], i32 2 +; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i32> [[TMP5]], i32 [[TMP2]], i32 3 +; CHECK-NEXT: [[TMP7:%.*]] = add nsw <4 x i32> undef, [[TMP6]] +; CHECK-NEXT: [[TMP8:%.*]] = ashr <4 x i32> [[TMP7]], +; CHECK-NEXT: [[ARRAYIDX372_3:%.*]] = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 3 +; CHECK-NEXT: [[TMP9:%.*]] = bitcast i32* [[ARRAYIDX372]] to <4 x i32>* +; CHECK-NEXT: store <4 x i32> [[TMP8]], <4 x i32>* [[TMP9]], align 4 +; CHECK-NEXT: unreachable +; +entry: + %add277 = add nsw i32 undef, undef + store i32 %add277, i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 1), align 4 + %0 = load i32, i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 0), align 4 + %sub355 = add nsw i32 undef, %0 + %shr.i = ashr i32 %sub355, 6 + %arrayidx372 = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 0 + store i32 %shr.i, i32* %arrayidx372, align 4 + %sub355.1 = add nsw i32 undef, %add277 + %shr.i.1 = ashr i32 %sub355.1, 6 + %arrayidx372.1 = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 1 + store i32 %shr.i.1, i32* %arrayidx372.1, align 4 + %1 = load i32, i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 2), align 4 + %sub355.2 = add nsw i32 undef, %1 + %shr.i.2 = ashr i32 %sub355.2, 6 + %arrayidx372.2 = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 2 + store i32 %shr.i.2, i32* %arrayidx372.2, align 4 + %2 = load i32, i32* getelementptr inbounds ([4 x [4 x i32]], [4 x [4 x i32]]* @bar, i64 0, i64 3, i64 3), align 4 + %sub355.3 = add nsw i32 undef, %2 + %shr.i.3 = ashr i32 %sub355.3, 6 + %arrayidx372.3 = getelementptr inbounds [4 x [4 x i32]], [4 x [4 x i32]]* @dct_luma, i64 0, i64 3, i64 3 + store i32 %shr.i.3, i32* %arrayidx372.3, align 4 + unreachable +} diff --git a/llvm/test/Transforms/SLPVectorizer/X86/partail.ll b/llvm/test/Transforms/SLPVectorizer/X86/partail.ll new file mode 100644 index 000000000000..b26df3fd84a2 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/partail.ll @@ -0,0 +1,75 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=bdver2 < %s | FileCheck %s + +; Function Attrs: nounwind uwtable +define void @get_block(i32 %y_pos) local_unnamed_addr #0 { +; CHECK-LABEL: @get_block( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[LAND_LHS_TRUE:%.*]] +; CHECK: land.lhs.true: +; CHECK-NEXT: br i1 undef, label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK: if.then: +; CHECK-NEXT: unreachable +; CHECK: if.end: +; CHECK-NEXT: [[SUB14:%.*]] = sub nsw i32 [[Y_POS:%.*]], undef +; CHECK-NEXT: [[SHR15:%.*]] = ashr i32 [[SUB14]], 2 +; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i32> undef, i32 [[SHR15]], i32 0 +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i32> [[TMP0]], i32 [[SUB14]], i32 1 +; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x i32> [[TMP1]], <2 x i32> undef, <4 x i32> +; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt <4 x i32> [[SHUFFLE]], +; CHECK-NEXT: [[TMP3:%.*]] = insertelement <4 x i32> undef, i32 [[SHR15]], i32 0 +; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> [[TMP3]], i32 undef, i32 1 +; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i32> [[TMP4]], i32 undef, i32 2 +; CHECK-NEXT: [[TMP6:%.*]] = insertelement <4 x i32> [[TMP5]], i32 undef, i32 3 +; CHECK-NEXT: [[TMP7:%.*]] = select <4 x i1> [[TMP2]], <4 x i32> [[TMP6]], <4 x i32> zeroinitializer +; CHECK-NEXT: [[TMP8:%.*]] = icmp slt <4 x i32> [[TMP7]], undef +; CHECK-NEXT: [[TMP9:%.*]] = select <4 x i1> [[TMP8]], <4 x i32> [[TMP7]], <4 x i32> undef +; CHECK-NEXT: [[TMP10:%.*]] = sext <4 x i32> [[TMP9]] to <4 x i64> +; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x i64> [[TMP10]], i32 0 +; CHECK-NEXT: [[ARRAYIDX31:%.*]] = getelementptr inbounds i16*, i16** undef, i64 [[TMP11]] +; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i64> [[TMP10]], i32 1 +; CHECK-NEXT: [[ARRAYIDX31_1:%.*]] = getelementptr inbounds i16*, i16** undef, i64 [[TMP12]] +; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x i64> [[TMP10]], i32 2 +; CHECK-NEXT: [[ARRAYIDX31_2:%.*]] = getelementptr inbounds i16*, i16** undef, i64 [[TMP13]] +; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x i64> [[TMP10]], i32 3 +; CHECK-NEXT: [[ARRAYIDX31_3:%.*]] = getelementptr inbounds i16*, i16** undef, i64 [[TMP14]] +; CHECK-NEXT: unreachable +; +entry: + br label %land.lhs.true + +land.lhs.true: ; preds = %entry + br i1 undef, label %if.then, label %if.end + +if.then: ; preds = %land.lhs.true + unreachable + +if.end: ; preds = %land.lhs.true + %sub14 = sub nsw i32 %y_pos, undef + %shr15 = ashr i32 %sub14, 2 + %cmp.i.i = icmp sgt i32 %shr15, 0 + %cond.i.i = select i1 %cmp.i.i, i32 %shr15, i32 0 + %cmp.i4.i = icmp slt i32 %cond.i.i, undef + %cond.i5.i = select i1 %cmp.i4.i, i32 %cond.i.i, i32 undef + %idxprom30 = sext i32 %cond.i5.i to i64 + %arrayidx31 = getelementptr inbounds i16*, i16** undef, i64 %idxprom30 + %cmp.i.i.1 = icmp sgt i32 %sub14, -1 + %cond.i.i.1 = select i1 %cmp.i.i.1, i32 undef, i32 0 + %cmp.i4.i.1 = icmp slt i32 %cond.i.i.1, undef + %cond.i5.i.1 = select i1 %cmp.i4.i.1, i32 %cond.i.i.1, i32 undef + %idxprom30.1 = sext i32 %cond.i5.i.1 to i64 + %arrayidx31.1 = getelementptr inbounds i16*, i16** undef, i64 %idxprom30.1 + %cmp.i.i.2 = icmp sgt i32 %sub14, -5 + %cond.i.i.2 = select i1 %cmp.i.i.2, i32 undef, i32 0 + %cmp.i4.i.2 = icmp slt i32 %cond.i.i.2, undef + %cond.i5.i.2 = select i1 %cmp.i4.i.2, i32 %cond.i.i.2, i32 undef + %idxprom30.2 = sext i32 %cond.i5.i.2 to i64 + %arrayidx31.2 = getelementptr inbounds i16*, i16** undef, i64 %idxprom30.2 + %cmp.i.i.3 = icmp sgt i32 %sub14, -9 + %cond.i.i.3 = select i1 %cmp.i.i.3, i32 undef, i32 0 + %cmp.i4.i.3 = icmp slt i32 %cond.i.i.3, undef + %cond.i5.i.3 = select i1 %cmp.i4.i.3, i32 %cond.i.i.3, i32 undef + %idxprom30.3 = sext i32 %cond.i5.i.3 to i64 + %arrayidx31.3 = getelementptr inbounds i16*, i16** undef, i64 %idxprom30.3 + unreachable +} diff --git a/llvm/test/Transforms/SLPVectorizer/X86/pr35497.ll b/llvm/test/Transforms/SLPVectorizer/X86/pr35497.ll new file mode 100644 index 000000000000..c6989c384e01 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/pr35497.ll @@ -0,0 +1,105 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +%class.1 = type { %class.2 } +%class.2 = type { %"class.3" } +%"class.3" = type { %"struct.1", i64 } +%"struct.1" = type { [8 x i64] } + +$_ZN1C10SwitchModeEv = comdat any + +; Function Attrs: uwtable +define void @_ZN1C10SwitchModeEv() local_unnamed_addr #0 comdat align 2 { +; CHECK-LABEL: @_ZN1C10SwitchModeEv( +; CHECK-NEXT: for.body.lr.ph.i: +; CHECK-NEXT: [[OR_1:%.*]] = or i64 undef, 1 +; CHECK-NEXT: store i64 [[OR_1]], i64* undef, align 8 +; CHECK-NEXT: [[FOO_1:%.*]] = getelementptr inbounds [[CLASS_1:%.*]], %class.1* undef, i64 0, i32 0, i32 0, i32 0, i32 0, i64 0 +; CHECK-NEXT: [[FOO_2:%.*]] = getelementptr inbounds [[CLASS_1]], %class.1* undef, i64 0, i32 0, i32 0, i32 0, i32 0, i64 1 +; CHECK-NEXT: [[TMP0:%.*]] = bitcast i64* [[FOO_1]] to <2 x i64>* +; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, <2 x i64>* [[TMP0]], align 8 +; CHECK-NEXT: [[BAR5:%.*]] = load i64, i64* undef, align 8 +; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> undef, i64 [[OR_1]], i32 0 +; CHECK-NEXT: [[TMP3:%.*]] = insertelement <2 x i64> [[TMP2]], i64 [[BAR5]], i32 1 +; CHECK-NEXT: [[TMP4:%.*]] = and <2 x i64> [[TMP3]], [[TMP1]] +; CHECK-NEXT: [[BAR3:%.*]] = getelementptr inbounds [[CLASS_2:%.*]], %class.2* undef, i64 0, i32 0, i32 0, i32 0, i64 0 +; CHECK-NEXT: [[BAR4:%.*]] = getelementptr inbounds [[CLASS_2]], %class.2* undef, i64 0, i32 0, i32 0, i32 0, i64 1 +; CHECK-NEXT: [[TMP5:%.*]] = bitcast i64* [[BAR3]] to <2 x i64>* +; CHECK-NEXT: store <2 x i64> [[TMP4]], <2 x i64>* [[TMP5]], align 8 +; CHECK-NEXT: ret void +; +for.body.lr.ph.i: + %or.1 = or i64 undef, 1 + store i64 %or.1, i64* undef, align 8 + %foo.1 = getelementptr inbounds %class.1, %class.1* undef, i64 0, i32 0, i32 0, i32 0, i32 0, i64 0 + %foo.3 = load i64, i64* %foo.1, align 8 + %foo.2 = getelementptr inbounds %class.1, %class.1* undef, i64 0, i32 0, i32 0, i32 0, i32 0, i64 1 + %foo.4 = load i64, i64* %foo.2, align 8 + %bar5 = load i64, i64* undef, align 8 + %and.2 = and i64 %or.1, %foo.3 + %and.1 = and i64 %bar5, %foo.4 + %bar3 = getelementptr inbounds %class.2, %class.2* undef, i64 0, i32 0, i32 0, i32 0, i64 0 + store i64 %and.2, i64* %bar3, align 8 + %bar4 = getelementptr inbounds %class.2, %class.2* undef, i64 0, i32 0, i32 0, i32 0, i64 1 + store i64 %and.1, i64* %bar4, align 8 + ret void +} + +; Function Attrs: norecurse nounwind uwtable +define void @pr35497() local_unnamed_addr #0 { +; CHECK-LABEL: @pr35497( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* undef, align 1 +; CHECK-NEXT: [[ADD:%.*]] = add i64 undef, undef +; CHECK-NEXT: store i64 [[ADD]], i64* undef, align 1 +; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 5 +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> undef, i64 [[TMP0]], i32 1 +; CHECK-NEXT: [[TMP2:%.*]] = shl <2 x i64> [[TMP1]], +; CHECK-NEXT: [[TMP3:%.*]] = and <2 x i64> , [[TMP2]] +; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 4 +; CHECK-NEXT: [[TMP4:%.*]] = add nuw nsw <2 x i64> [[TMP3]], zeroinitializer +; CHECK-NEXT: [[ARRAYIDX2_5:%.*]] = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 1 +; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i64> [[TMP4]], i32 1 +; CHECK-NEXT: [[TMP6:%.*]] = insertelement <2 x i64> undef, i64 [[TMP5]], i32 0 +; CHECK-NEXT: [[TMP7:%.*]] = insertelement <2 x i64> [[TMP6]], i64 [[ADD]], i32 1 +; CHECK-NEXT: [[TMP8:%.*]] = shl <2 x i64> [[TMP7]], +; CHECK-NEXT: [[TMP9:%.*]] = and <2 x i64> , [[TMP8]] +; CHECK-NEXT: [[ARRAYIDX2_6:%.*]] = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 0 +; CHECK-NEXT: [[TMP10:%.*]] = bitcast i64* [[ARRAYIDX2_6]] to <2 x i64>* +; CHECK-NEXT: store <2 x i64> [[TMP4]], <2 x i64>* [[TMP10]], align 1 +; CHECK-NEXT: [[TMP11:%.*]] = lshr <2 x i64> [[TMP4]], +; CHECK-NEXT: [[TMP12:%.*]] = add nuw nsw <2 x i64> [[TMP9]], [[TMP11]] +; CHECK-NEXT: [[TMP13:%.*]] = bitcast i64* [[ARRAYIDX2_2]] to <2 x i64>* +; CHECK-NEXT: store <2 x i64> [[TMP12]], <2 x i64>* [[TMP13]], align 1 +; CHECK-NEXT: ret void +; +entry: + %0 = load i64, i64* undef, align 1 + %and = shl i64 %0, 2 + %shl = and i64 %and, 20 + %add = add i64 undef, undef + store i64 %add, i64* undef, align 1 + %arrayidx2.1 = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 5 + %and.1 = shl i64 undef, 2 + %shl.1 = and i64 %and.1, 20 + %shr.1 = lshr i64 undef, 6 + %add.1 = add nuw nsw i64 %shl, %shr.1 + %arrayidx2.2 = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 4 + %shr.2 = lshr i64 undef, 6 + %add.2 = add nuw nsw i64 %shl.1, %shr.2 + %and.4 = shl i64 %add, 2 + %shl.4 = and i64 %and.4, 20 + %arrayidx2.5 = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 1 + store i64 %add.1, i64* %arrayidx2.5, align 1 + %and.5 = shl nuw nsw i64 %add.1, 2 + %shl.5 = and i64 %and.5, 20 + %shr.5 = lshr i64 %add.1, 6 + %add.5 = add nuw nsw i64 %shl.4, %shr.5 + store i64 %add.5, i64* %arrayidx2.1, align 1 + %arrayidx2.6 = getelementptr inbounds [0 x i64], [0 x i64]* undef, i64 0, i64 0 + store i64 %add.2, i64* %arrayidx2.6, align 1 + %shr.6 = lshr i64 %add.2, 6 + %add.6 = add nuw nsw i64 %shl.5, %shr.6 + store i64 %add.6, i64* %arrayidx2.2, align 1 + ret void +} diff --git a/llvm/test/Transforms/SLPVectorizer/X86/resched.ll b/llvm/test/Transforms/SLPVectorizer/X86/resched.ll new file mode 100644 index 000000000000..b60cb9a75334 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/X86/resched.ll @@ -0,0 +1,158 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=bdver2 < %s | FileCheck %s + +%"struct.std::array" = type { [32 x i8] } + +; Function Attrs: nounwind uwtable +define fastcc void @_ZN12_GLOBAL__N_127PolynomialMultiplyRecognize9recognizeEv() unnamed_addr #0 align 2 { +; CHECK-LABEL: @_ZN12_GLOBAL__N_127PolynomialMultiplyRecognize9recognizeEv( +; CHECK-NEXT: entry: +; CHECK-NEXT: br i1 undef, label [[IF_END50_I:%.*]], label [[IF_THEN22_I:%.*]] +; CHECK: if.then22.i: +; CHECK-NEXT: [[SUB_I:%.*]] = add nsw i32 undef, -1 +; CHECK-NEXT: [[CONV31_I:%.*]] = and i32 undef, [[SUB_I]] +; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 0 +; CHECK-NEXT: [[SHR_I_I:%.*]] = lshr i32 [[CONV31_I]], 1 +; CHECK-NEXT: [[ARRAYIDX_I_I7_1_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 1 +; CHECK-NEXT: [[SHR_1_I_I:%.*]] = lshr i32 [[CONV31_I]], 2 +; CHECK-NEXT: [[ARRAYIDX_I_I7_2_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 2 +; CHECK-NEXT: [[SHR_2_I_I:%.*]] = lshr i32 [[CONV31_I]], 3 +; CHECK-NEXT: [[ARRAYIDX_I_I7_3_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 3 +; CHECK-NEXT: [[SHR_3_I_I:%.*]] = lshr i32 [[CONV31_I]], 4 +; CHECK-NEXT: [[ARRAYIDX_I_I7_4_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 4 +; CHECK-NEXT: [[SHR_4_I_I:%.*]] = lshr i32 [[CONV31_I]], 5 +; CHECK-NEXT: [[ARRAYIDX_I_I7_5_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 5 +; CHECK-NEXT: [[SHR_5_I_I:%.*]] = lshr i32 [[CONV31_I]], 6 +; CHECK-NEXT: [[ARRAYIDX_I_I7_6_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 6 +; CHECK-NEXT: [[SHR_6_I_I:%.*]] = lshr i32 [[CONV31_I]], 7 +; CHECK-NEXT: [[ARRAYIDX_I_I7_7_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 7 +; CHECK-NEXT: [[SHR_7_I_I:%.*]] = lshr i32 [[CONV31_I]], 8 +; CHECK-NEXT: [[ARRAYIDX_I_I7_8_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 8 +; CHECK-NEXT: [[SHR_8_I_I:%.*]] = lshr i32 [[CONV31_I]], 9 +; CHECK-NEXT: [[ARRAYIDX_I_I7_9_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 9 +; CHECK-NEXT: [[SHR_9_I_I:%.*]] = lshr i32 [[CONV31_I]], 10 +; CHECK-NEXT: [[ARRAYIDX_I_I7_10_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 10 +; CHECK-NEXT: [[SHR_10_I_I:%.*]] = lshr i32 [[CONV31_I]], 11 +; CHECK-NEXT: [[ARRAYIDX_I_I7_11_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 11 +; CHECK-NEXT: [[SHR_11_I_I:%.*]] = lshr i32 [[CONV31_I]], 12 +; CHECK-NEXT: [[ARRAYIDX_I_I7_12_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 12 +; CHECK-NEXT: [[SHR_12_I_I:%.*]] = lshr i32 [[CONV31_I]], 13 +; CHECK-NEXT: [[ARRAYIDX_I_I7_13_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 13 +; CHECK-NEXT: [[SHR_13_I_I:%.*]] = lshr i32 [[CONV31_I]], 14 +; CHECK-NEXT: [[ARRAYIDX_I_I7_14_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 14 +; CHECK-NEXT: [[SHR_14_I_I:%.*]] = lshr i32 [[CONV31_I]], 15 +; CHECK-NEXT: [[TMP1:%.*]] = insertelement <16 x i32> undef, i32 [[SUB_I]], i32 0 +; CHECK-NEXT: [[TMP2:%.*]] = insertelement <16 x i32> [[TMP1]], i32 [[SHR_I_I]], i32 1 +; CHECK-NEXT: [[TMP3:%.*]] = insertelement <16 x i32> [[TMP2]], i32 [[SHR_1_I_I]], i32 2 +; CHECK-NEXT: [[TMP4:%.*]] = insertelement <16 x i32> [[TMP3]], i32 [[SHR_2_I_I]], i32 3 +; CHECK-NEXT: [[TMP5:%.*]] = insertelement <16 x i32> [[TMP4]], i32 [[SHR_3_I_I]], i32 4 +; CHECK-NEXT: [[TMP6:%.*]] = insertelement <16 x i32> [[TMP5]], i32 [[SHR_4_I_I]], i32 5 +; CHECK-NEXT: [[TMP7:%.*]] = insertelement <16 x i32> [[TMP6]], i32 [[SHR_5_I_I]], i32 6 +; CHECK-NEXT: [[TMP8:%.*]] = insertelement <16 x i32> [[TMP7]], i32 [[SHR_6_I_I]], i32 7 +; CHECK-NEXT: [[TMP9:%.*]] = insertelement <16 x i32> [[TMP8]], i32 [[SHR_7_I_I]], i32 8 +; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x i32> [[TMP9]], i32 [[SHR_8_I_I]], i32 9 +; CHECK-NEXT: [[TMP11:%.*]] = insertelement <16 x i32> [[TMP10]], i32 [[SHR_9_I_I]], i32 10 +; CHECK-NEXT: [[TMP12:%.*]] = insertelement <16 x i32> [[TMP11]], i32 [[SHR_10_I_I]], i32 11 +; CHECK-NEXT: [[TMP13:%.*]] = insertelement <16 x i32> [[TMP12]], i32 [[SHR_11_I_I]], i32 12 +; CHECK-NEXT: [[TMP14:%.*]] = insertelement <16 x i32> [[TMP13]], i32 [[SHR_12_I_I]], i32 13 +; CHECK-NEXT: [[TMP15:%.*]] = insertelement <16 x i32> [[TMP14]], i32 [[SHR_13_I_I]], i32 14 +; CHECK-NEXT: [[TMP16:%.*]] = insertelement <16 x i32> [[TMP15]], i32 [[SHR_14_I_I]], i32 15 +; CHECK-NEXT: [[TMP17:%.*]] = trunc <16 x i32> [[TMP16]] to <16 x i8> +; CHECK-NEXT: [[TMP18:%.*]] = and <16 x i8> , [[TMP17]] +; CHECK-NEXT: [[ARRAYIDX_I_I7_15_I_I:%.*]] = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 15 +; CHECK-NEXT: [[TMP19:%.*]] = bitcast i8* [[TMP0]] to <16 x i8>* +; CHECK-NEXT: store <16 x i8> [[TMP18]], <16 x i8>* [[TMP19]], align 1 +; CHECK-NEXT: unreachable +; CHECK: if.end50.i: +; CHECK-NEXT: ret void +; +entry: + br i1 undef, label %if.end50.i, label %if.then22.i + +if.then22.i: ; preds = %entry + %sub.i = add nsw i32 undef, -1 + %conv31.i = and i32 undef, %sub.i + %0 = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 0 + %1 = trunc i32 %sub.i to i8 + %conv.i.i1199 = and i8 %1, 1 + store i8 %conv.i.i1199, i8* %0, align 1 + %shr.i.i = lshr i32 %conv31.i, 1 + %2 = trunc i32 %shr.i.i to i8 + %conv.1.i.i = and i8 %2, 1 + %arrayidx.i.i7.1.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 1 + store i8 %conv.1.i.i, i8* %arrayidx.i.i7.1.i.i, align 1 + %shr.1.i.i = lshr i32 %conv31.i, 2 + %3 = trunc i32 %shr.1.i.i to i8 + %conv.2.i.i = and i8 %3, 1 + %arrayidx.i.i7.2.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 2 + store i8 %conv.2.i.i, i8* %arrayidx.i.i7.2.i.i, align 1 + %shr.2.i.i = lshr i32 %conv31.i, 3 + %4 = trunc i32 %shr.2.i.i to i8 + %conv.3.i.i = and i8 %4, 1 + %arrayidx.i.i7.3.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 3 + store i8 %conv.3.i.i, i8* %arrayidx.i.i7.3.i.i, align 1 + %shr.3.i.i = lshr i32 %conv31.i, 4 + %5 = trunc i32 %shr.3.i.i to i8 + %conv.4.i.i = and i8 %5, 1 + %arrayidx.i.i7.4.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 4 + store i8 %conv.4.i.i, i8* %arrayidx.i.i7.4.i.i, align 1 + %shr.4.i.i = lshr i32 %conv31.i, 5 + %6 = trunc i32 %shr.4.i.i to i8 + %conv.5.i.i = and i8 %6, 1 + %arrayidx.i.i7.5.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 5 + store i8 %conv.5.i.i, i8* %arrayidx.i.i7.5.i.i, align 1 + %shr.5.i.i = lshr i32 %conv31.i, 6 + %7 = trunc i32 %shr.5.i.i to i8 + %conv.6.i.i = and i8 %7, 1 + %arrayidx.i.i7.6.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 6 + store i8 %conv.6.i.i, i8* %arrayidx.i.i7.6.i.i, align 1 + %shr.6.i.i = lshr i32 %conv31.i, 7 + %8 = trunc i32 %shr.6.i.i to i8 + %conv.7.i.i = and i8 %8, 1 + %arrayidx.i.i7.7.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 7 + store i8 %conv.7.i.i, i8* %arrayidx.i.i7.7.i.i, align 1 + %shr.7.i.i = lshr i32 %conv31.i, 8 + %9 = trunc i32 %shr.7.i.i to i8 + %conv.8.i.i = and i8 %9, 1 + %arrayidx.i.i7.8.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 8 + store i8 %conv.8.i.i, i8* %arrayidx.i.i7.8.i.i, align 1 + %shr.8.i.i = lshr i32 %conv31.i, 9 + %10 = trunc i32 %shr.8.i.i to i8 + %conv.9.i.i = and i8 %10, 1 + %arrayidx.i.i7.9.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 9 + store i8 %conv.9.i.i, i8* %arrayidx.i.i7.9.i.i, align 1 + %shr.9.i.i = lshr i32 %conv31.i, 10 + %11 = trunc i32 %shr.9.i.i to i8 + %conv.10.i.i = and i8 %11, 1 + %arrayidx.i.i7.10.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 10 + store i8 %conv.10.i.i, i8* %arrayidx.i.i7.10.i.i, align 1 + %shr.10.i.i = lshr i32 %conv31.i, 11 + %12 = trunc i32 %shr.10.i.i to i8 + %conv.11.i.i = and i8 %12, 1 + %arrayidx.i.i7.11.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 11 + store i8 %conv.11.i.i, i8* %arrayidx.i.i7.11.i.i, align 1 + %shr.11.i.i = lshr i32 %conv31.i, 12 + %13 = trunc i32 %shr.11.i.i to i8 + %conv.12.i.i = and i8 %13, 1 + %arrayidx.i.i7.12.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 12 + store i8 %conv.12.i.i, i8* %arrayidx.i.i7.12.i.i, align 1 + %shr.12.i.i = lshr i32 %conv31.i, 13 + %14 = trunc i32 %shr.12.i.i to i8 + %conv.13.i.i = and i8 %14, 1 + %arrayidx.i.i7.13.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 13 + store i8 %conv.13.i.i, i8* %arrayidx.i.i7.13.i.i, align 1 + %shr.13.i.i = lshr i32 %conv31.i, 14 + %15 = trunc i32 %shr.13.i.i to i8 + %conv.14.i.i = and i8 %15, 1 + %arrayidx.i.i7.14.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 14 + store i8 %conv.14.i.i, i8* %arrayidx.i.i7.14.i.i, align 1 + %shr.14.i.i = lshr i32 %conv31.i, 15 + %16 = trunc i32 %shr.14.i.i to i8 + %conv.15.i.i = and i8 %16, 1 + %arrayidx.i.i7.15.i.i = getelementptr inbounds %"struct.std::array", %"struct.std::array"* undef, i64 0, i32 0, i64 15 + store i8 %conv.15.i.i, i8* %arrayidx.i.i7.15.i.i, align 1 + unreachable + +if.end50.i: ; preds = %entry + ret void +}