[Attributor] Ensure to simplify operands in AAValueConstantRange
authorJohannes Doerfert <johannes@jdoerfert.de>
Thu, 15 Jul 2021 21:09:33 +0000 (16:09 -0500)
committerJohannes Doerfert <johannes@jdoerfert.de>
Tue, 20 Jul 2021 05:35:14 +0000 (00:35 -0500)
As with other patches before, the simplification callback interface
requires us to go through the Attributor::getAssumedSimplified API first
before we recurs.

It is unclear if the problem can be explicitly tested with our current
infrastructure.

llvm/lib/Transforms/IPO/AttributorAttributes.cpp

index f514c17..9753755 100644 (file)
@@ -8279,9 +8279,20 @@ struct AAValueConstantRangeFloating : AAValueConstantRangeImpl {
       Instruction *I = dyn_cast<Instruction>(&V);
       if (!I || isa<CallBase>(I)) {
 
+        // Simplify the operand first.
+        bool UsedAssumedInformation = false;
+        const auto &SimplifiedOpV =
+            A.getAssumedSimplified(IRPosition::value(V, getCallBaseContext()),
+                                   *this, UsedAssumedInformation);
+        if (!SimplifiedOpV.hasValue())
+          return true;
+        Value *VPtr = &V;
+        if (*SimplifiedOpV)
+          VPtr = *SimplifiedOpV;
+
         // If the value is not instruction, we query AA to Attributor.
         const auto &AA = A.getAAFor<AAValueConstantRange>(
-            *this, IRPosition::value(V, getCallBaseContext()),
+            *this, IRPosition::value(*VPtr, getCallBaseContext()),
             DepClassTy::REQUIRED);
 
         // Clamp operator is not used to utilize a program point CtxI.