[llvm-bugs] [Bug 49012] New: IRCE wouldn't deal with range checks which predicate is uge.

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Feb 2 23:24:48 PST 2021


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

            Bug ID: 49012
           Summary: IRCE wouldn't deal with range checks which predicate
                    is uge.
           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

recently, I tried to use llvm to optimize my code generated by a managed VM.
this VM will instrument many range check code before memory access operations.
I found the optimization IRCE wouldn't work when the range check with the
predicate "uge". I wrote the following c/c++ code to simulate my code, where
len is the max buf length:

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);
    }
}

the above code wouldn't be optimised as expected into 2 loops (iteration range
splitting). I checked the llvm code, found in function
InductiveRangeCheck::parseRangeCheckICmp(), it wouldn't deal with uge cases,
I'm not sure if it is intentional.

but I tried to modify the llvm IR code by replacing the uge to ult, and
interchanging the operands of next branch instruction. the optimization IRCE
works as expected.

my test command is below:
first, get a clean llvm IR file.
./clang++ -O3 -Xclang -disable-llvm-passes  ~/testRCE.cpp  -emit-llvm -S -o
~/testRCE.TBBA.ll

second, optimize it with other loop optimization.
./opt -gvn -simplifycfg -loop-simplify -loop-predication -licm -dce -mem2reg
-dce -jump-threading -lcssa -simplifycfg -loop-simplify  -dce -stats
-debug-pass=Executions ~/testRCE.TBBA.ll -S -o ~/testRCE.mem2reg.ll

finally, take IRCE.
./opt -irce-skip-profitability-checks -irce -dce -S ~/testRCE.mem2reg.ll -o
~/testRCE.irce.ll

-- 
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/731eab21/attachment.html>


More information about the llvm-bugs mailing list