[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