[InstCombine] add/use overflowing math helper functions; NFC
authorSanjay Patel <spatel@rotateright.com>
Fri, 14 Sep 2018 21:30:07 +0000 (21:30 +0000)
committerSanjay Patel <spatel@rotateright.com>
Fri, 14 Sep 2018 21:30:07 +0000 (21:30 +0000)
The mul case can already be refactored to use this similar to
rL342278.
The sub case is proposed in D52075.

llvm-svn: 342289

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp
llvm/lib/Transforms/InstCombine/InstCombineInternal.h

index c0fd14b..838ef3a 100644 (file)
@@ -1062,9 +1062,7 @@ Instruction *InstCombiner::narrowAddIfNoOverflow(BinaryOperator &I) {
   }
   // Both operands have narrow versions. Last step: the math must not overflow
   // in the narrow width.
-  bool WillNotOverflow = IsSext ? willNotOverflowSignedAdd(X, Y, I)
-                                : willNotOverflowUnsignedAdd(X, Y, I);
-  if (!WillNotOverflow)
+  if (!willNotOverflowAdd(X, Y, I, IsSext))
     return nullptr;
 
   // add (ext X), (ext Y) --> ext (add X, Y)
index 228a616..1462660 100644 (file)
@@ -496,6 +496,12 @@ private:
            OverflowResult::NeverOverflows;
   }
 
+  bool willNotOverflowAdd(const Value *LHS, const Value *RHS,
+                          const Instruction &CxtI, bool IsSigned) const {
+    return IsSigned ? willNotOverflowSignedAdd(LHS, RHS, CxtI)
+                    : willNotOverflowUnsignedAdd(LHS, RHS, CxtI);
+  }
+
   bool willNotOverflowSignedSub(const Value *LHS, const Value *RHS,
                                 const Instruction &CxtI) const {
     return computeOverflowForSignedSub(LHS, RHS, &CxtI) ==
@@ -508,6 +514,12 @@ private:
            OverflowResult::NeverOverflows;
   }
 
+  bool willNotOverflowSub(const Value *LHS, const Value *RHS,
+                          const Instruction &CxtI, bool IsSigned) const {
+    return IsSigned ? willNotOverflowSignedSub(LHS, RHS, CxtI)
+                    : willNotOverflowUnsignedSub(LHS, RHS, CxtI);
+  }
+
   bool willNotOverflowSignedMul(const Value *LHS, const Value *RHS,
                                 const Instruction &CxtI) const {
     return computeOverflowForSignedMul(LHS, RHS, &CxtI) ==
@@ -520,6 +532,12 @@ private:
            OverflowResult::NeverOverflows;
   }
 
+  bool willNotOverflowMul(const Value *LHS, const Value *RHS,
+                          const Instruction &CxtI, bool IsSigned) const {
+    return IsSigned ? willNotOverflowSignedMul(LHS, RHS, CxtI)
+                    : willNotOverflowUnsignedMul(LHS, RHS, CxtI);
+  }
+
   Value *EmitGEPOffset(User *GEP);
   Instruction *scalarizePHI(ExtractElementInst &EI, PHINode *PN);
   Value *EvaluateInDifferentElementOrder(Value *V, ArrayRef<int> Mask);