Skip to content

Commit d85f8df

Browse files
committed
Fix logic to compare and substitute FPM of the Select
1 parent 575a897 commit d85f8df

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

llvm/lib/Transforms/Vectorize/VectorCombine.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,12 +1918,13 @@ bool VectorCombine::foldShuffleOfSelects(Instruction &I) {
19181918
if (!C1VecTy || !C2VecTy || C1VecTy != C2VecTy)
19191919
return false;
19201920

1921+
auto *SI0FOp = dyn_cast<FPMathOperator>(I.getOperand(0));
1922+
auto *SI1FOp = dyn_cast<FPMathOperator>(I.getOperand(1));
19211923
// SelectInsts must have the same FMF.
1922-
auto *Select0 = cast<Instruction>(I.getOperand(0));
1923-
if (auto *SI0FOp = dyn_cast<FPMathOperator>(Select0))
1924-
if (auto *SI1FOp = dyn_cast<FPMathOperator>((I.getOperand(1))))
1925-
if (SI0FOp->getFastMathFlags() != SI1FOp->getFastMathFlags())
1926-
return false;
1924+
if (((SI0FOp == nullptr) != (SI1FOp == nullptr)) ||
1925+
((SI0FOp != nullptr) &&
1926+
(SI0FOp->getFastMathFlags() != SI1FOp->getFastMathFlags())))
1927+
return false;
19271928

19281929
auto SK = TargetTransformInfo::SK_PermuteTwoSrc;
19291930
auto SelOp = Instruction::Select;
@@ -1954,11 +1955,13 @@ bool VectorCombine::foldShuffleOfSelects(Instruction &I) {
19541955
Value *ShuffleCmp = Builder.CreateShuffleVector(C1, C2, Mask);
19551956
Value *ShuffleTrue = Builder.CreateShuffleVector(T1, T2, Mask);
19561957
Value *ShuffleFalse = Builder.CreateShuffleVector(F1, F2, Mask);
1957-
Value *NewSel = Builder.CreateSelect(ShuffleCmp, ShuffleTrue, ShuffleFalse);
1958-
1958+
Value *NewSel;
19591959
// We presuppose that the SelectInsts have the same FMF.
1960-
if (isa<FPMathOperator>(NewSel))
1961-
cast<Instruction>(NewSel)->setFastMathFlags(Select0->getFastMathFlags());
1960+
if (SI0FOp)
1961+
NewSel = Builder.CreateSelectFMF(ShuffleCmp, ShuffleTrue, ShuffleFalse,
1962+
SI0FOp->getFastMathFlags());
1963+
else
1964+
NewSel = Builder.CreateSelect(ShuffleCmp, ShuffleTrue, ShuffleFalse);
19621965

19631966
Worklist.pushValue(ShuffleCmp);
19641967
Worklist.pushValue(ShuffleTrue);

0 commit comments

Comments
 (0)