Skip to content

Commit 29c89d7

Browse files
authored
[VectorCombine] foldShuffleOfShuffles - fold "shuffle (shuffle x, y, m1), (shuffle y, x, m2)" -> "shuffle x, y, m3" (#120959)
foldShuffleOfShuffles currently only folds unary shuffles to ensure we don't end up with a merged shuffle with more than 2 sources, but this prevented cases where both shuffles were sharing sources. This patch generalizes the merge process to find up to 2 sources as it merges with the inner shuffles, it also moves the undef/poison handling stages into the merge loop as well. Fixes #120764
1 parent adb849e commit 29c89d7

File tree

3 files changed

+82
-91
lines changed

3 files changed

+82
-91
lines changed

llvm/lib/Transforms/Vectorize/VectorCombine.cpp

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,6 +1871,7 @@ bool VectorCombine::foldShuffleOfCastops(Instruction &I) {
18711871
}
18721872

18731873
/// Try to convert any of:
1874+
/// "shuffle (shuffle x, y), (shuffle y, x)"
18741875
/// "shuffle (shuffle x, undef), (shuffle y, undef)"
18751876
/// "shuffle (shuffle x, undef), y"
18761877
/// "shuffle x, (shuffle y, undef)"
@@ -1883,78 +1884,106 @@ bool VectorCombine::foldShuffleOfShuffles(Instruction &I) {
18831884
return false;
18841885

18851886
ArrayRef<int> InnerMask0, InnerMask1;
1886-
Value *V0 = nullptr, *V1 = nullptr;
1887-
UndefValue *U0 = nullptr, *U1 = nullptr;
1888-
bool Match0 = match(
1889-
OuterV0, m_Shuffle(m_Value(V0), m_UndefValue(U0), m_Mask(InnerMask0)));
1890-
bool Match1 = match(
1891-
OuterV1, m_Shuffle(m_Value(V1), m_UndefValue(U1), m_Mask(InnerMask1)));
1887+
Value *X0, *X1, *Y0, *Y1;
1888+
bool Match0 =
1889+
match(OuterV0, m_Shuffle(m_Value(X0), m_Value(Y0), m_Mask(InnerMask0)));
1890+
bool Match1 =
1891+
match(OuterV1, m_Shuffle(m_Value(X1), m_Value(Y1), m_Mask(InnerMask1)));
18921892
if (!Match0 && !Match1)
18931893
return false;
18941894

1895-
V0 = Match0 ? V0 : OuterV0;
1896-
V1 = Match1 ? V1 : OuterV1;
1895+
X0 = Match0 ? X0 : OuterV0;
1896+
Y0 = Match0 ? Y0 : OuterV0;
1897+
X1 = Match1 ? X1 : OuterV1;
1898+
Y1 = Match1 ? Y1 : OuterV1;
18971899
auto *ShuffleDstTy = dyn_cast<FixedVectorType>(I.getType());
1898-
auto *ShuffleSrcTy = dyn_cast<FixedVectorType>(V0->getType());
1899-
auto *ShuffleImmTy = dyn_cast<FixedVectorType>(I.getOperand(0)->getType());
1900+
auto *ShuffleSrcTy = dyn_cast<FixedVectorType>(X0->getType());
1901+
auto *ShuffleImmTy = dyn_cast<FixedVectorType>(OuterV0->getType());
19001902
if (!ShuffleDstTy || !ShuffleSrcTy || !ShuffleImmTy ||
1901-
V0->getType() != V1->getType())
1903+
X0->getType() != X1->getType())
19021904
return false;
19031905

19041906
unsigned NumSrcElts = ShuffleSrcTy->getNumElements();
19051907
unsigned NumImmElts = ShuffleImmTy->getNumElements();
19061908

1907-
// Bail if either inner masks reference a RHS undef arg.
1908-
if ((Match0 && !isa<PoisonValue>(U0) &&
1909-
any_of(InnerMask0, [&](int M) { return M >= (int)NumSrcElts; })) ||
1910-
(Match1 && !isa<PoisonValue>(U1) &&
1911-
any_of(InnerMask1, [&](int M) { return M >= (int)NumSrcElts; })))
1912-
return false;
1913-
1914-
// Merge shuffles - replace index to the RHS poison arg with PoisonMaskElem,
1909+
// Attempt to merge shuffles, matching upto 2 source operands.
1910+
// Replace index to a poison arg with PoisonMaskElem.
1911+
// Bail if either inner masks reference an undef arg.
19151912
SmallVector<int, 16> NewMask(OuterMask);
1913+
Value *NewX = nullptr, *NewY = nullptr;
19161914
for (int &M : NewMask) {
1915+
Value *Src = nullptr;
19171916
if (0 <= M && M < (int)NumImmElts) {
1918-
if (Match0)
1919-
M = (InnerMask0[M] >= (int)NumSrcElts) ? PoisonMaskElem : InnerMask0[M];
1917+
Src = OuterV0;
1918+
if (Match0) {
1919+
M = InnerMask0[M];
1920+
Src = M >= (int)NumSrcElts ? Y0 : X0;
1921+
M = M >= (int)NumSrcElts ? (M - NumSrcElts) : M;
1922+
}
19201923
} else if (M >= (int)NumImmElts) {
1924+
Src = OuterV1;
1925+
M -= NumImmElts;
19211926
if (Match1) {
1922-
if (InnerMask1[M - NumImmElts] >= (int)NumSrcElts)
1923-
M = PoisonMaskElem;
1924-
else
1925-
M = InnerMask1[M - NumImmElts] + (V0 == V1 ? 0 : NumSrcElts);
1927+
M = InnerMask1[M];
1928+
Src = M >= (int)NumSrcElts ? Y1 : X1;
1929+
M = M >= (int)NumSrcElts ? (M - NumSrcElts) : M;
19261930
}
19271931
}
1932+
if (Src && M != PoisonMaskElem) {
1933+
assert(0 <= M && M < (int)NumSrcElts && "Unexpected shuffle mask index");
1934+
if (isa<UndefValue>(Src)) {
1935+
// We've referenced an undef element - if its poison, update the shuffle
1936+
// mask, else bail.
1937+
if (!isa<PoisonValue>(Src))
1938+
return false;
1939+
M = PoisonMaskElem;
1940+
continue;
1941+
}
1942+
if (!NewX || NewX == Src) {
1943+
NewX = Src;
1944+
continue;
1945+
}
1946+
if (!NewY || NewY == Src) {
1947+
M += NumSrcElts;
1948+
NewY = Src;
1949+
continue;
1950+
}
1951+
return false;
1952+
}
19281953
}
19291954

1955+
if (!NewX)
1956+
return PoisonValue::get(ShuffleDstTy);
1957+
if (!NewY)
1958+
NewY = PoisonValue::get(ShuffleSrcTy);
1959+
19301960
// Have we folded to an Identity shuffle?
19311961
if (ShuffleVectorInst::isIdentityMask(NewMask, NumSrcElts)) {
1932-
replaceValue(I, *V0);
1962+
replaceValue(I, *NewX);
19331963
return true;
19341964
}
19351965

19361966
// Try to merge the shuffles if the new shuffle is not costly.
19371967
InstructionCost InnerCost0 = 0;
19381968
if (Match0)
1939-
InnerCost0 = TTI.getShuffleCost(
1940-
TargetTransformInfo::SK_PermuteSingleSrc, ShuffleSrcTy, InnerMask0,
1941-
CostKind, 0, nullptr, {V0, U0}, cast<ShuffleVectorInst>(OuterV0));
1969+
InnerCost0 = TTI.getInstructionCost(cast<Instruction>(OuterV0), CostKind);
19421970

19431971
InstructionCost InnerCost1 = 0;
19441972
if (Match1)
1945-
InnerCost1 = TTI.getShuffleCost(
1946-
TargetTransformInfo::SK_PermuteSingleSrc, ShuffleSrcTy, InnerMask1,
1947-
CostKind, 0, nullptr, {V1, U1}, cast<ShuffleVectorInst>(OuterV1));
1973+
InnerCost1 = TTI.getInstructionCost(cast<Instruction>(OuterV1), CostKind);
19481974

19491975
InstructionCost OuterCost = TTI.getShuffleCost(
19501976
TargetTransformInfo::SK_PermuteTwoSrc, ShuffleImmTy, OuterMask, CostKind,
19511977
0, nullptr, {OuterV0, OuterV1}, &I);
19521978

19531979
InstructionCost OldCost = InnerCost0 + InnerCost1 + OuterCost;
19541980

1955-
InstructionCost NewCost =
1956-
TTI.getShuffleCost(TargetTransformInfo::SK_PermuteTwoSrc, ShuffleSrcTy,
1957-
NewMask, CostKind, 0, nullptr, {V0, V1});
1981+
bool IsUnary = all_of(NewMask, [&](int M) { return M < (int)NumSrcElts; });
1982+
TargetTransformInfo::ShuffleKind SK =
1983+
IsUnary ? TargetTransformInfo::SK_PermuteSingleSrc
1984+
: TargetTransformInfo::SK_PermuteTwoSrc;
1985+
InstructionCost NewCost = TTI.getShuffleCost(
1986+
SK, ShuffleSrcTy, NewMask, CostKind, 0, nullptr, {NewX, NewY});
19581987
if (!OuterV0->hasOneUse())
19591988
NewCost += InnerCost0;
19601989
if (!OuterV1->hasOneUse())
@@ -1966,13 +1995,7 @@ bool VectorCombine::foldShuffleOfShuffles(Instruction &I) {
19661995
if (NewCost > OldCost)
19671996
return false;
19681997

1969-
// Clear unused sources to poison.
1970-
if (none_of(NewMask, [&](int M) { return 0 <= M && M < (int)NumSrcElts; }))
1971-
V0 = PoisonValue::get(ShuffleSrcTy);
1972-
if (none_of(NewMask, [&](int M) { return (int)NumSrcElts <= M; }))
1973-
V1 = PoisonValue::get(ShuffleSrcTy);
1974-
1975-
Value *Shuf = Builder.CreateShuffleVector(V0, V1, NewMask);
1998+
Value *Shuf = Builder.CreateShuffleVector(NewX, NewY, NewMask);
19761999
replaceValue(I, *Shuf);
19772000
return true;
19782001
}

llvm/test/Transforms/PhaseOrdering/X86/hadd.ll

Lines changed: 15 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -391,21 +391,11 @@ define <4 x i32> @add_v4i32_01uu(<4 x i32> %a, <4 x i32> %b) {
391391
;
392392

393393
define <8 x i32> @add_v8i32_01234567(<8 x i32> %a, <8 x i32> %b) {
394-
; SSE-LABEL: @add_v8i32_01234567(
395-
; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 8, i32 10>
396-
; SSE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 4, i32 6, i32 12, i32 14>
397-
; SSE-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 1, i32 3, i32 9, i32 11>
398-
; SSE-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <4 x i32> <i32 5, i32 7, i32 13, i32 15>
399-
; SSE-NEXT: [[TMP5:%.*]] = add <4 x i32> [[TMP1]], [[TMP3]]
400-
; SSE-NEXT: [[TMP6:%.*]] = add <4 x i32> [[TMP2]], [[TMP4]]
401-
; SSE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> [[TMP6]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
402-
; SSE-NEXT: ret <8 x i32> [[TMP7]]
403-
;
404-
; AVX-LABEL: @add_v8i32_01234567(
405-
; AVX-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>
406-
; AVX-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>
407-
; AVX-NEXT: [[TMP3:%.*]] = add <8 x i32> [[TMP1]], [[TMP2]]
408-
; AVX-NEXT: ret <8 x i32> [[TMP3]]
394+
; CHECK-LABEL: @add_v8i32_01234567(
395+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>
396+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>
397+
; CHECK-NEXT: [[TMP3:%.*]] = add <8 x i32> [[TMP1]], [[TMP2]]
398+
; CHECK-NEXT: ret <8 x i32> [[TMP3]]
409399
;
410400
%a0 = extractelement <8 x i32> %a, i32 0
411401
%a1 = extractelement <8 x i32> %a, i32 1
@@ -786,21 +776,11 @@ define <4 x float> @add_v4f32_01uu(<4 x float> %a, <4 x float> %b) {
786776
;
787777

788778
define <8 x float> @add_v8f32_01234567(<8 x float> %a, <8 x float> %b) {
789-
; SSE-LABEL: @add_v8f32_01234567(
790-
; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <4 x i32> <i32 0, i32 2, i32 8, i32 10>
791-
; SSE-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 4, i32 6, i32 12, i32 14>
792-
; SSE-NEXT: [[TMP3:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 1, i32 3, i32 9, i32 11>
793-
; SSE-NEXT: [[TMP4:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <4 x i32> <i32 5, i32 7, i32 13, i32 15>
794-
; SSE-NEXT: [[TMP5:%.*]] = fadd <4 x float> [[TMP1]], [[TMP3]]
795-
; SSE-NEXT: [[TMP6:%.*]] = fadd <4 x float> [[TMP2]], [[TMP4]]
796-
; SSE-NEXT: [[TMP7:%.*]] = shufflevector <4 x float> [[TMP5]], <4 x float> [[TMP6]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
797-
; SSE-NEXT: ret <8 x float> [[TMP7]]
798-
;
799-
; AVX-LABEL: @add_v8f32_01234567(
800-
; AVX-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>
801-
; AVX-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>
802-
; AVX-NEXT: [[TMP3:%.*]] = fadd <8 x float> [[TMP1]], [[TMP2]]
803-
; AVX-NEXT: ret <8 x float> [[TMP3]]
779+
; CHECK-LABEL: @add_v8f32_01234567(
780+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[A:%.*]], <8 x float> [[B:%.*]], <8 x i32> <i32 0, i32 2, i32 8, i32 10, i32 4, i32 6, i32 12, i32 14>
781+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x float> [[A]], <8 x float> [[B]], <8 x i32> <i32 1, i32 3, i32 9, i32 11, i32 5, i32 7, i32 13, i32 15>
782+
; CHECK-NEXT: [[TMP3:%.*]] = fadd <8 x float> [[TMP1]], [[TMP2]]
783+
; CHECK-NEXT: ret <8 x float> [[TMP3]]
804784
;
805785
%a0 = extractelement <8 x float> %a, i32 0
806786
%a1 = extractelement <8 x float> %a, i32 1
@@ -969,21 +949,11 @@ define <2 x double> @add_v2f64_0u(<2 x double> %a, <2 x double> %b) {
969949
;
970950

971951
define <4 x double> @add_v4f64_0123(<4 x double> %a, <4 x double> %b) {
972-
; SSE-LABEL: @add_v4f64_0123(
973-
; SSE-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <2 x i32> <i32 0, i32 4>
974-
; SSE-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 2, i32 6>
975-
; SSE-NEXT: [[TMP3:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 1, i32 5>
976-
; SSE-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <2 x i32> <i32 3, i32 7>
977-
; SSE-NEXT: [[TMP5:%.*]] = fadd <2 x double> [[TMP1]], [[TMP3]]
978-
; SSE-NEXT: [[TMP6:%.*]] = fadd <2 x double> [[TMP2]], [[TMP4]]
979-
; SSE-NEXT: [[TMP7:%.*]] = shufflevector <2 x double> [[TMP5]], <2 x double> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
980-
; SSE-NEXT: ret <4 x double> [[TMP7]]
981-
;
982-
; AVX-LABEL: @add_v4f64_0123(
983-
; AVX-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 6>
984-
; AVX-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 7>
985-
; AVX-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]
986-
; AVX-NEXT: ret <4 x double> [[TMP3]]
952+
; CHECK-LABEL: @add_v4f64_0123(
953+
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[A:%.*]], <4 x double> [[B:%.*]], <4 x i32> <i32 0, i32 4, i32 2, i32 6>
954+
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[B]], <4 x i32> <i32 1, i32 5, i32 3, i32 7>
955+
; CHECK-NEXT: [[TMP3:%.*]] = fadd <4 x double> [[TMP1]], [[TMP2]]
956+
; CHECK-NEXT: ret <4 x double> [[TMP3]]
987957
;
988958
%a0 = extractelement <4 x double> %a, i32 0
989959
%a1 = extractelement <4 x double> %a, i32 1

llvm/test/Transforms/VectorCombine/AArch64/select-shuffle.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -952,8 +952,7 @@ define <16 x i32> @testoutofbounds(<16 x i32> %x, <16 x i32> %y) {
952952
; CHECK-NEXT: [[A:%.*]] = add nsw <16 x i32> [[S1]], [[S2]]
953953
; CHECK-NEXT: [[B:%.*]] = sub nsw <16 x i32> [[S1]], [[S2]]
954954
; CHECK-NEXT: [[S3:%.*]] = shufflevector <16 x i32> [[A]], <16 x i32> [[B]], <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
955-
; CHECK-NEXT: [[S4:%.*]] = shufflevector <16 x i32> [[S3]], <16 x i32> poison, <16 x i32> <i32 16, i32 1, i32 18, i32 3, i32 20, i32 5, i32 22, i32 7, i32 24, i32 9, i32 26, i32 11, i32 28, i32 13, i32 30, i32 15>
956-
; CHECK-NEXT: [[ADD:%.*]] = add <16 x i32> [[S3]], [[S4]]
955+
; CHECK-NEXT: [[ADD:%.*]] = add <16 x i32> [[S3]], [[B]]
957956
; CHECK-NEXT: ret <16 x i32> [[ADD]]
958957
;
959958
%s1 = shufflevector <16 x i32> %x, <16 x i32> %y, <16 x i32> <i32 0, i32 17, i32 2, i32 19, i32 4, i32 21, i32 6, i32 23, i32 8, i32 25, i32 10, i32 27, i32 12, i32 29, i32 14, i32 31>
@@ -973,8 +972,7 @@ define <64 x i32> @testlargerextrashuffle2(i32 %call.i, <16 x i32> %0) {
973972
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <16 x i32> [[TMP0]], i32 [[CALL_I]], i32 15
974973
; CHECK-NEXT: [[TMP3:%.*]] = sub <16 x i32> [[TMP1]], [[TMP2]]
975974
; CHECK-NEXT: [[TMP4:%.*]] = add <16 x i32> [[TMP1]], [[TMP2]]
976-
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> [[TMP4]], <16 x i32> <i32 0, i32 17, i32 2, i32 3, i32 20, i32 5, i32 6, i32 23, i32 8, i32 9, i32 26, i32 11, i32 12, i32 29, i32 14, i32 15>
977-
; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <16 x i32> [[TMP5]], <16 x i32> poison, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
975+
; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <16 x i32> [[TMP3]], <16 x i32> [[TMP4]], <64 x i32> <i32 0, i32 17, i32 2, i32 3, i32 20, i32 5, i32 6, i32 23, i32 8, i32 9, i32 26, i32 11, i32 12, i32 29, i32 14, i32 15, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
978976
; CHECK-NEXT: ret <64 x i32> [[TMP6]]
979977
;
980978
entry:

0 commit comments

Comments
 (0)