http://llvm.org/bugs/show_bug.cgi?id=11449

             Bug #: 11449
           Summary: instcombine can introduce wrapping into a nuw/nsw
                    operation
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Transformation Utilities
        AssignedTo: [email protected]
        ReportedBy: [email protected]
                CC: [email protected], [email protected]
    Classification: Unclassified


When instcombine sees an add/sub with nsw/nuw, where the sign bit is not
demanded, it does not demand the sign bit in the input. The following IR is
misoptimized:

; ModuleID = '<stdin>'
target datalayout =
"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define i32 @_Z1fiii(i32 %a, i32 %b, i32 %c) nounwind {
entry:
  %or = or i32 %b, 2147483647
  %xor = xor i32 %a, %or
  %add = add nsw i32 %xor, %c
  %and = and i32 %add, 2147483647
  ret i32 %and
}

define i32 @_Z1gi(i32 %c) nounwind {
entry:
  %call = call i32 @_Z1fiii(i32 -1, i32 -1, i32 %c)
  ret i32 %call
}

If we run this through opt -inline -instcombine, we get correct IR:

define i32 @_Z1gi(i32 %c) nounwind {
entry:
  %and.i = and i32 %c, 2147483647
  ret i32 %and.i
}

If we run this through opt -instcombine -inline, we get incorrect IR:

define i32 @_Z1gi(i32 %c) nounwind {
entry:
  %add.i = add nsw i32 -2147483648, %c
  %and.i = and i32 %add.i, 2147483647
  ret i32 %and.i
}

This function produces a trap value for negative %c; the original code did not.
Perhaps operators with nsw or nuw should implicitly demand the sign bit from
their operands, even if the sign bit of the result is not demanded.

-- 
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.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to