[LLVMbugs] [Bug 2408] New: CBE generates code that violates C signed integer overflow rules

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Tue Jun 3 05:53:19 PDT 2008


           Summary: CBE generates code that violates C signed integer
                    overflow rules
           Product: new-bugs
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: sharparrow1 at yahoo.com
                CC: llvmbugs at cs.uiuc.edu

define i32 @a(i32 %a) {
        %shr = ashr i32 %a, 0           ; <i32> [#uses=1]
        %shr2 = ashr i32 2, 0           ; <i32> [#uses=1]
        %mul = mul i32 %shr, %shr2              ; <i32> [#uses=1]
        %shr4 = ashr i32 2, 0           ; <i32> [#uses=1]
        %div = sdiv i32 %mul, %shr4             ; <i32> [#uses=1]
        ret i32 %div

Result of "llc -march=c | ~/bin/gcc-4.3 -x c - -o - -S -O3 -fno-strict-aliasing
        movl    4(%esp), %eax

The semantics of this are not the same as those of the original code; for
example, take a(INT_MIN).

A bit contrived, but I'm reasonably sure this could affect real code.

To avoid this, the C backend should make sure to always do
addition/subtraction/multiplication in unsigned types.

Alternatively, we could suggest that -fwrapv should always be used with
CBE-generated code, but that seems unnecessary.  (If we go with this option,
anything that invokes gcc with CBE-generated code needs to be fixed.)

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list