[LLVMbugs] [Bug 1215] NEW: can't constantfold sdiv 0, -1

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Wed Feb 21 20:28:28 PST 2007


           Summary: can't constantfold sdiv 0, -1
           Product: libraries
           Version: trunk
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Core LLVM classes
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: nicholas at mxc.ca

I encountered an assertion failure in scalar evolutions:

opt: ScalarEvolution.cpp:2362: llvm::SCEVHandle
llvm::SCEVAddRecExpr::getNumIterationsInRange(llvm::ConstantRange, bool) const:
Assertion `isa<ConstantInt>(ExitValue) && "Constant folding of integers not
implemented?"' failed.

The assertion has found a real problem. The line in question is
"ConstantExpr::getSDiv(ExitValue, A);" where ExitValue is i32 0 and A is i32 -1.
getSDiv eventually gets into this case in ConstantFoldBinaryInstruction

00572       case Instruction::SDiv:
00573         if (CI2->isNullValue()) return 0;        // X / 0 -> can't fold
00574         if (CI2->isAllOnesValue() &&
00575             (((CI1->getType()->getPrimitiveSizeInBits() == 64) && 
00576               (CI1->getSExtValue() == INT64_MIN)) ||
00577              (CI1->getSExtValue() == -CI1->getSExtValue())))
00578           return 0;                              // MIN_INT / -1 -> overflow
00579         return ConstantInt::get(C1->getType(), 
00580                                 CI1->getSExtValue() / CI2->getSExtValue());

Given that CI1 is the left hand side, CI1->getSExtValue() ==
-CI1->getSExtValue() when the left is 0.

This code also fails to properly fold arbitrary precision integers, so it
deserves to be rewritten.

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.

More information about the llvm-bugs mailing list