[llvm-bugs] [Bug 49014] New: IRCE wouldn't work when trip count is unsigned and br condition is equality.

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Feb 3 00:08:24 PST 2021


https://bugs.llvm.org/show_bug.cgi?id=49014

            Bug ID: 49014
           Summary: IRCE wouldn't work when trip count is unsigned and br
                    condition is equality.
           Product: libraries
           Version: 11.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Loop Optimizer
          Assignee: unassignedbugs at nondot.org
          Reporter: jie.he.cn at gmail.com
                CC: llvm-bugs at lists.llvm.org

please refer to Bug 49012 for the story.

this time, I made a little change in the previous code. I updated the exit
conditon to "NE" from "ULT", like below:

void testIRCE(unsigned int * buf, unsigned int len, unsigned int
iteration_count) {
    if (iteration_count > 0) {
        unsigned int i = 0;
        do {
            if (i >= len) { // range check
                printf("overflow\n");
                return;
            }

            buf[i] = i;

            i ++;

        } while (i != iteration_count);
    }
}

from C code, we know iteration_count is always an non-negative value (it's an
unsigned int and I add a condition guard outside the loop), and the loop will
exit as expected. but IRCE doesn't work because it thinks iteration_count will
overflow. see the code in function LoopStructure::parseLoopStructure():

if (ICI->isEquality() && !HasNoSignedWrap(IndVarBase)) {
    FailureReason = "LHS in icmp needs nsw for equality predicates";
    return None;
  }

then I skip the check and go to the next. soon,I meet another check when try to
replace NE to ULT, it seems still can't prove iteration_count is non-negative.
see the code in  function LoopStructure::parseLoopStructure():

if (isKnownNonNegativeInLoop(IndVarStart, &L, SE) &&
    isKnownNonNegativeInLoop(RightSCEV, &L, SE))
    Pred = ICmpInst::ICMP_ULT;
else
    Pred = ICmpInst::ICMP_SLT;

the function isKnownNonNegativeInLoop is intended to prove iteration_count SGE
0. from C code, iteration_count is an unsigned int and "> 0", but at LLVM IR
code, it's hard to prove iteration_count SGE 0, LLVM IR doesn't care if it's an
unsigned int. I don't know if there is better way to let the compiler knows
iteration_count is great than 0.

finally, I have to change the type of iteration_count from unsigned to signed,
the optimization IRCE works.

I don't know if there is better idea to let the optimzation

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20210203/3c64a26d/attachment-0001.html>


More information about the llvm-bugs mailing list