llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
29.39k stars 12.15k forks source link

IRCE wouldn't deal with range checks which predicate is uge. #48356

Open llvmbot opened 3 years ago

llvmbot commented 3 years ago
Bugzilla Link 49012
Version 11.0
OS Linux
Reporter LLVM Bugzilla Contributor
CC @preames

Extended Description

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

preames commented 3 years ago

This appears to be a valid bug. Feel like contributing a patch? If not, I can take a quick look, but I am not going to have a lot of time to look at this.