[PATCH] D12988: [Bug 24848] Use range metadata to constant fold comparisons with constant values
    Sanjoy Das via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Fri Sep 18 18:30:01 PDT 2015
    
    
  
sanjoy requested changes to this revision.
This revision now requires changes to proceed.
================
Comment at: lib/Analysis/InstructionSimplify.cpp:2392
@@ +2391,3 @@
+          ConstantInt *LowerBound =
+              mdconst::extract<ConstantInt>(Ranges->getOperand(2 * i + 0));
+          ConstantInt *UpperBound =
----------------
I don't think this is correct.  When an instruction has a `!range` like `[a,b) [c,d)`, the set of possible values is the union of all of these ranges.
For instance, I think you'll constant fold `x slt 10` to `true` here if the range of `x` is `[0,9) [100,200)`, even though `x` can be `120`.
I also don't think `FirstRangeContainsSecond` is a good abstraction, and its name is misleading.
I'd structure this bit of code as:
instead of
```
    if (Lower != Upper) {
      ConstantRange LHS_CR = ConstantRange(Lower, Upper);
      if (Value *RetVal =
          FirstRangeContainsSecond(RHS_CR, LHS_CR, RHS->getContext())) {
        return RetVal;
      }
    }
```
```
ConstantRange LHS_CR = Lower == Upper ? ConstantRange::getFullSet() : ConstantRange(Lower, Upper);
if (Instruction has !range MD) {
  ConstantRange CR = NullSet;
  for (auto Range : Inst->Ranges) {
    CR = CR.union(RangeMD)
  }
  LHS_CR = LHS_CR.intersect(CR);
}
if (!LHS_CR.isFullSet()) {
  if (RHS_CR.contains(LHS_CR))
  ... // the code as it is today
}
```
http://reviews.llvm.org/D12988
    
    
More information about the llvm-commits
mailing list