[LLVMbugs] [Bug 2611] New: smax scev is redundant with umax

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Tue Jul 29 22:22:55 PDT 2008


           Summary: smax scev is redundant with umax
           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

Per discussion with nicholas on IRC, the SMAX and UMAX scevs are redundant; "a
smax b" can be rewritten as "((a + INT_MIN) umax (b + INT_MIN)) + INT_MIN".

Quick explanation of the reasoning: the range of signed integers is from
INT_MIN to INT_MAX.  The range of unsigned integers is from 0 to UINT_MAX.  By
adding INT_MIN to a number, it is mapped from the signed integer range to the
unsigned integer range in the correct order.  Then, the umax returns the larger
number, and then adding INT_MIN again restores the result into the range of
signed numbers.

For implementation, the idea is mostly straightforward: just replace
getSMaxExpr with a getSMaxSCEV which does this mapping.  The subtle point is
not getting any regressions in code quality.  The ScalarEvolutionExpander
probably should be made a bit smarter, and instcombine probably should be made
smart enough to deal with expressions like this (currently, instcombine can't
fold the naive expansion at all).

2's complement arithmetic and comparisons is so much fun.  Good way to make
your head spin. :)

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