PR1255 (case ranges: work with ConstantRangesSet instead of ConstantInt) related...
[oota-llvm.git] / lib / ExecutionEngine / Interpreter / Execution.cpp
index af47be9c5b56f45e10cd18fd770dbca148bf9391..298ce2c2b95b72edbe0f18c1431d64683ed0ae85 100644 (file)
@@ -651,10 +651,16 @@ void Interpreter::visitSwitchInst(SwitchInst &I) {
   // Check to see if any of the cases match...
   BasicBlock *Dest = 0;
   for (SwitchInst::CaseIt i = I.case_begin(), e = I.case_end(); i != e; ++i) {
-    GenericValue CaseVal = getOperandValue(i.getCaseValue(), SF);
-    if (executeICMP_EQ(CondVal, CaseVal, ElTy).IntVal != 0) {
-      Dest = cast<BasicBlock>(i.getCaseSuccessor());
-      break;
+    ConstantRangesSet Case = i.getCaseValueEx();
+    for (unsigned n = 0, en = Case.getNumItems(); n != en; ++n) {
+      ConstantRangesSet::Range r = Case.getItem(n);
+      GenericValue Low = getOperandValue(r.Low, SF);
+      GenericValue High = getOperandValue(r.High, SF);
+      if (executeICMP_ULE(Low, CondVal, ElTy).IntVal != 0 &&
+          executeICMP_ULE(CondVal, High, ElTy).IntVal != 0) {
+        Dest = cast<BasicBlock>(i.getCaseSuccessor());
+        break;        
+      }
     }
   }
   if (!Dest) Dest = I.getDefaultDest();   // No cases matched: use default