[llvm] r271845 - [IndVars] Remove -liv-reduce

Sanjoy Das via llvm-commits llvm-commits at lists.llvm.org
Sun Jun 5 11:01:12 PDT 2016


Author: sanjoy
Date: Sun Jun  5 13:01:12 2016
New Revision: 271845

URL: http://llvm.org/viewvc/llvm-project?rev=271845&view=rev
Log:
[IndVars] Remove -liv-reduce

It is an off-by-default option that no one seems to use[0], and given
that SCEV directly understands the overflow instrinsics there is no real
need for it anymore.

[0]: http://lists.llvm.org/pipermail/llvm-dev/2016-April/098181.html

Removed:
    llvm/trunk/test/Transforms/IndVarSimplify/overflowcheck.ll
Modified:
    llvm/trunk/include/llvm/Transforms/Utils/SimplifyIndVar.h
    llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
    llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp

Modified: llvm/trunk/include/llvm/Transforms/Utils/SimplifyIndVar.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/SimplifyIndVar.h?rev=271845&r1=271844&r2=271845&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Utils/SimplifyIndVar.h (original)
+++ llvm/trunk/include/llvm/Transforms/Utils/SimplifyIndVar.h Sun Jun  5 13:01:12 2016
@@ -33,24 +33,14 @@ class ScalarEvolution;
 class IVVisitor {
 protected:
   const DominatorTree *DT;
-  bool ShouldSplitOverflowIntrinsics;
 
   virtual void anchor();
 
 public:
-  IVVisitor(): DT(nullptr), ShouldSplitOverflowIntrinsics(false) {}
+  IVVisitor() : DT(nullptr) {}
   virtual ~IVVisitor() {}
 
   const DominatorTree *getDomTree() const { return DT; }
-
-  bool shouldSplitOverflowInstrinsics() const {
-    return ShouldSplitOverflowIntrinsics;
-  }
-  void setSplitOverflowIntrinsics() {
-    ShouldSplitOverflowIntrinsics = true;
-    assert(DT && "Splitting overflow intrinsics requires a DomTree.");
-  }
-
   virtual void visitCast(CastInst *Cast) = 0;
 };
 

Modified: llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=271845&r1=271844&r2=271845&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Sun Jun  5 13:01:12 2016
@@ -68,9 +68,6 @@ static cl::opt<bool> VerifyIndvars(
   "verify-indvars", cl::Hidden,
   cl::desc("Verify the ScalarEvolution result after running indvars"));
 
-static cl::opt<bool> ReduceLiveIVs("liv-reduce", cl::Hidden,
-  cl::desc("Reduce live induction variables."));
-
 enum ReplaceExitVal { NeverRepl, OnlyCheapRepl, AlwaysRepl };
 
 static cl::opt<ReplaceExitVal> ReplaceExitValue(
@@ -1489,8 +1486,6 @@ public:
     : SE(SCEV), TTI(TTI), IVPhi(IV) {
     DT = DTree;
     WI.NarrowIV = IVPhi;
-    if (ReduceLiveIVs)
-      setSplitOverflowIntrinsics();
   }
 
   // Implement the interface used by simplifyUsersOfIV.

Modified: llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp?rev=271845&r1=271844&r2=271845&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp Sun Jun  5 13:01:12 2016
@@ -76,9 +76,6 @@ namespace {
     void eliminateIVRemainder(BinaryOperator *Rem, Value *IVOperand,
                               bool IsSigned);
     bool strengthenOverflowingOperation(BinaryOperator *OBO, Value *IVOperand);
-
-    Instruction *splitOverflowIntrinsic(Instruction *IVUser,
-                                        const DominatorTree *DT);
   };
 }
 
@@ -552,69 +549,6 @@ bool SimplifyIndvar::strengthenOverflowi
   return Changed;
 }
 
-/// \brief Split sadd.with.overflow into add + sadd.with.overflow to allow
-/// analysis and optimization.
-///
-/// \return A new value representing the non-overflowing add if possible,
-/// otherwise return the original value.
-Instruction *SimplifyIndvar::splitOverflowIntrinsic(Instruction *IVUser,
-                                                    const DominatorTree *DT) {
-  IntrinsicInst *II = dyn_cast<IntrinsicInst>(IVUser);
-  if (!II || II->getIntrinsicID() != Intrinsic::sadd_with_overflow)
-    return IVUser;
-
-  // Find a branch guarded by the overflow check.
-  BranchInst *Branch = nullptr;
-  Instruction *AddVal = nullptr;
-  for (User *U : II->users()) {
-    if (ExtractValueInst *ExtractInst = dyn_cast<ExtractValueInst>(U)) {
-      if (ExtractInst->getNumIndices() != 1)
-        continue;
-      if (ExtractInst->getIndices()[0] == 0)
-        AddVal = ExtractInst;
-      else if (ExtractInst->getIndices()[0] == 1 && ExtractInst->hasOneUse())
-        Branch = dyn_cast<BranchInst>(ExtractInst->user_back());
-    }
-  }
-  if (!AddVal || !Branch)
-    return IVUser;
-
-  BasicBlock *ContinueBB = Branch->getSuccessor(1);
-  if (std::next(pred_begin(ContinueBB)) != pred_end(ContinueBB))
-    return IVUser;
-
-  // Check if all users of the add are provably NSW.
-  bool AllNSW = true;
-  for (Use &U : AddVal->uses()) {
-    if (Instruction *UseInst = dyn_cast<Instruction>(U.getUser())) {
-      BasicBlock *UseBB = UseInst->getParent();
-      if (PHINode *PHI = dyn_cast<PHINode>(UseInst))
-        UseBB = PHI->getIncomingBlock(U);
-      if (!DT->dominates(ContinueBB, UseBB)) {
-        AllNSW = false;
-        break;
-      }
-    }
-  }
-  if (!AllNSW)
-    return IVUser;
-
-  // Go for it...
-  IRBuilder<> Builder(IVUser);
-  Instruction *AddInst = dyn_cast<Instruction>(
-    Builder.CreateNSWAdd(II->getOperand(0), II->getOperand(1)));
-
-  // The caller expects the new add to have the same form as the intrinsic. The
-  // IV operand position must be the same.
-  assert((AddInst->getOpcode() == Instruction::Add &&
-          AddInst->getOperand(0) == II->getOperand(0)) &&
-         "Bad add instruction created from overflow intrinsic.");
-
-  AddVal->replaceAllUsesWith(AddInst);
-  DeadInsts.emplace_back(AddVal);
-  return AddInst;
-}
-
 /// Add all uses of Def to the current IV's worklist.
 static void pushIVUsers(
   Instruction *Def,
@@ -689,12 +623,6 @@ void SimplifyIndvar::simplifyUsers(PHINo
     // Bypass back edges to avoid extra work.
     if (UseInst == CurrIV) continue;
 
-    if (V && V->shouldSplitOverflowInstrinsics()) {
-      UseInst = splitOverflowIntrinsic(UseInst, V->getDomTree());
-      if (!UseInst)
-        continue;
-    }
-
     Instruction *IVOperand = UseOper.second;
     for (unsigned N = 0; IVOperand; ++N) {
       assert(N <= Simplified.size() && "runaway iteration");

Removed: llvm/trunk/test/Transforms/IndVarSimplify/overflowcheck.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/overflowcheck.ll?rev=271844&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/overflowcheck.ll (original)
+++ llvm/trunk/test/Transforms/IndVarSimplify/overflowcheck.ll (removed)
@@ -1,56 +0,0 @@
-; RUN: opt < %s -indvars -liv-reduce -S | FileCheck %s
-target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
-target triple = "x86_64-apple-macosx"
-
-; CHECK-LABEL: @addwithoverflow
-; CHECK-LABEL: loop1:
-; CHECK-NOT: zext
-; CHECK: add nsw
-; CHECK: @llvm.sadd.with.overflow
-; CHECK-LABEL: loop2:
-; CHECK-NOT: extractvalue
-; CHECK: add nuw
-; CHECK: @llvm.sadd.with.overflow
-; CHECK-LABEL: loop3:
-; CHECK-NOT: extractvalue
-; CHECK: ret
-define i64 @addwithoverflow(i32 %n, i64* %a) {
-entry:
-  br label %loop0
-
-loop0:
-  %i = phi i32 [ 0, %entry ], [ %i1val, %loop3 ]
-  %s = phi i32 [ 0, %entry ], [ %addsval, %loop3 ]
-  %bc = icmp ult i32 %i, %n
-  br i1 %bc, label %loop1, label %exit
-
-loop1:
-  %zxt = zext i32 %i to i64
-  %ofs = shl nuw nsw i64 %zxt, 3
-  %gep = getelementptr i64, i64* %a, i64 %zxt
-  %v = load i64, i64* %gep, align 8
-  %truncv = trunc i64 %v to i32
-  %adds = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %s, i32 %truncv)
-  %ovflows = extractvalue { i32, i1 } %adds, 1
-  br i1 %ovflows, label %exit, label %loop2
-
-loop2:
-  %addsval = extractvalue { i32, i1 } %adds, 0
-  %i1 = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %i, i32 1)
-  %i1check = extractvalue { i32, i1 } %i1, 1
-  br i1 %i1check, label %exit, label %loop3
-
-loop3:
-  %i1val = extractvalue { i32, i1 } %i1, 0
-  %test = icmp slt i32 %i1val, %n
-  br i1 %test, label %return, label %loop0
-
-return:
-  %ret = zext i32 %addsval to i64
-  ret i64 %ret
-
-exit:
-  unreachable
-}
-
-declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32)




More information about the llvm-commits mailing list