[PATCH] D37019: Add select simplifications
David Majnemer via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 19 10:27:33 PDT 2017
majnemer added inline comments.
================
Comment at: lib/Transforms/InstCombine/InstructionCombining.cpp:735-749
+ if (isa<FPMathOperator>(&I)) {
+ BuilderTy::FastMathFlagGuard Guard(Builder);
+ Builder.setFastMathFlags(I.getFastMathFlags());
+ Value *V1 = SimplifyBinOp(Opcode, C, E, SQ.getWithInstruction(&I));
+ SI = (V1) ? Builder.CreateSelect(A1, Builder.CreateBinOp(Opcode, B, D), V1) : SI;
+ if (Value *V2 = SimplifyBinOp(Opcode, B, D, SQ.getWithInstruction(&I)))
+ SI = (V1) ? Builder.CreateSelect(A1, V2, V1) :
----------------
I think you can reduce the duplication by doing something like:
BuilderTy::FastMathFlagGuard Guard(Builder);
if (isa<FPMathOperator>(&I))
Builder.setFastMathFlags(I.getFastMathFlags());
Value *V1 = SimplifyBinOp(Opcode, C, E, SQ.getWithInstruction(&I));
SI = V1 ? Builder.CreateSelect(A1, Builder.CreateBinOp(Opcode, B, D), V1) : SI;
if (Value *V2 = SimplifyBinOp(Opcode, B, D, SQ.getWithInstruction(&I)))
SI = V1 ? Builder.CreateSelect(A1, V2, V1) : Builder.CreateSelect(A1, V2, Builder.CreateBinOp(Opcode, C, E));
if (SI) {
SI->takeName(&I);
return SI;
}
The guard will harmlessly no-op when we don't have an FP operator.
https://reviews.llvm.org/D37019
More information about the llvm-commits
mailing list