@@ -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