[llvm-dev] Why IRCE wouldn't deal with the range check which has a predicate "uge"?

Jie He via llvm-dev llvm-dev at lists.llvm.org
Fri Feb 5 02:53:46 PST 2021


Hi Philip

Thanks for your response.

Yes, previously, I also thought there is one pass which could change the
predicate from ">=" to "<", like some gvn passes did, update "-" to "+".
but I can't find it.

I tried to use -O3 to build the code, the target IR file shows all
conditions are uniformed to "EQ". and then took the IRCE pass, no
optimization occurs.
I didn't check the code why it didn't happen, because I know there is
another thing which causes IRCE doesn't work when trip count
comparison uses "EQ/NE", but it's irrelevant to this thread.

B.R
Jie He

On Fri, 5 Feb 2021 at 09:05, Philip Reames <listmail at philipreames.com>
wrote:

> )Quick response, may be off base as I'm taking a guess based on a quick
> read through.)
>
> IRCE - like many llvm passes - assumes IR has been canonicalized by other
> passes.  If you run your IR through -O3 and then IRCE, do you get what you
> expect?
>
> Philip
> On 2/4/21 12:43 AM, Jie He via llvm-dev wrote:
>
> Hi
>
> Recently, I tried to use llvm to optimize my code generated by a managed VM. this VM will instrument many range check codes 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 the 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--
>
>
> Best Regards
> He Jie 何杰
>
> _______________________________________________
> LLVM Developers mailing listllvm-dev at lists.llvm.orghttps://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>

-- 
Best Regards
He Jie 何杰
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210205/ca7180f3/attachment.html>


More information about the llvm-dev mailing list