[BasicAA] Bail out earlier for invalid shift amount
authorNikita Popov <nikita.ppv@gmail.com>
Sat, 27 Mar 2021 11:32:31 +0000 (12:32 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Sat, 27 Mar 2021 11:41:16 +0000 (12:41 +0100)
Currently, we'd produce an incorrect decomposition, because we
already recursively called GetLinearExpression(), so the Scale=1,
Offset=0 will not necessarily be relative to the shl itself.

Now, this doesn't actually matter for functional correctness,
because such a shift is poison anyway, so its okay to return
an incorrect decomposition. It's still unnecessarily confusing
though, and we can easily avoid this by checking the bitwidth
earlier.

llvm/lib/Analysis/BasicAliasAnalysis.cpp

index 6246cad..ab0d180 100644 (file)
@@ -297,9 +297,6 @@ static bool isObjectSize(const Value *V, uint64_t Size, const DataLayout &DL,
         Scale *= RHS;
         break;
       case Instruction::Shl:
-        V = GetLinearExpression(BOp->getOperand(0), Scale, Offset, ZExtBits,
-                                SExtBits, DL, Depth + 1, AC, DT, NSW, NUW);
-
         // We're trying to linearize an expression of the kind:
         //   shl i8 -128, 36
         // where the shift count exceeds the bitwidth of the type.
@@ -312,6 +309,8 @@ static bool isObjectSize(const Value *V, uint64_t Size, const DataLayout &DL,
           return V;
         }
 
+        V = GetLinearExpression(BOp->getOperand(0), Scale, Offset, ZExtBits,
+                                SExtBits, DL, Depth + 1, AC, DT, NSW, NUW);
         Offset <<= RHS.getLimitedValue();
         Scale <<= RHS.getLimitedValue();
         break;