[llvm] 14f350d - [IndVars] Don't forget value when inferring nowrap flags

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 4 11:57:34 PDT 2021


Author: Nikita Popov
Date: 2021-06-04T20:57:22+02:00
New Revision: 14f350daf290e9d7f3eef700acf930d8b0887007

URL: https://github.com/llvm/llvm-project/commit/14f350daf290e9d7f3eef700acf930d8b0887007
DIFF: https://github.com/llvm/llvm-project/commit/14f350daf290e9d7f3eef700acf930d8b0887007.diff

LOG: [IndVars] Don't forget value when inferring nowrap flags

When SimplifyIndVars infers IR nowrap flags from SCEV, this may
happen in two ways: Either nowrap flags were already present in
SCEV and just get transferred to IR. Or zero/sign extension of
addrecs infers additional nowrap flags, and those get transferred
to IR. In the latter case, calling forgetValue() ensures that the
newly inferred nowrap flags get propagated to any other SCEV
expressions based on the addrec. However, the invalidation can
also have a major compile-time effect in some cases. For
https://bugs.llvm.org/show_bug.cgi?id=50384 with n=512 compile-
time drops from 7.1s to 0.8s without this invalidation. At the
same time, removing the invalidation doesn't affect any codegen
in test-suite.

Differential Revision: https://reviews.llvm.org/D103424

Added: 
    

Modified: 
    llvm/lib/Transforms/Utils/SimplifyIndVar.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
index d4f325cd46828..246bc0adaf6c8 100644
--- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
@@ -772,17 +772,20 @@ bool SimplifyIndvar::strengthenOverflowingOperation(BinaryOperator *BO,
   if (!BO->hasNoUnsignedWrap() &&
       willNotOverflow(SE, BO->getOpcode(), /* Signed */ false, LHS, RHS)) {
     BO->setHasNoUnsignedWrap();
-    SE->forgetValue(BO);
     Changed = true;
   }
 
   if (!BO->hasNoSignedWrap() &&
       willNotOverflow(SE, BO->getOpcode(), /* Signed */ true, LHS, RHS)) {
     BO->setHasNoSignedWrap();
-    SE->forgetValue(BO);
     Changed = true;
   }
 
+  // The willNotOverflow() check might infer additional nowrap flags on addrecs
+  // while performing zero/sign extensions. We could call forgetValue() here
+  // to make sure those flags also propagate to any other SCEV expressions
+  // based on the addrec. However, this can have pathological compile-time
+  // impact, see https://bugs.llvm.org/show_bug.cgi?id=50384.
   return Changed;
 }
 


        


More information about the llvm-commits mailing list