diff options
| author | Yingwei Zheng <dtcxzyw2333@gmail.com> | 2025-10-29 10:52:28 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-29 10:52:28 +0800 |
| commit | e8a1162b7be6cf11041260886097843ce9f5e4a3 (patch) | |
| tree | 5c23f1a948121d5e92a98f991dc2921505958978 /lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp | |
| parent | d604ab62885fcc4aaa66b712125377a01dcc7e1a (diff) | |
| download | llvm-e8a1162b7be6cf11041260886097843ce9f5e4a3.zip llvm-e8a1162b7be6cf11041260886097843ce9f5e4a3.tar.gz llvm-e8a1162b7be6cf11041260886097843ce9f5e4a3.tar.bz2 | |
[SimplifyCFG] Use range check in simplifyBranchOnICmpChain if possible (#165105)
In `simplifyBranchOnICmpChain`, if we can merge the comparisons into a
range check, use a conditional branch instead. This change also breaks
the cycle found in https://github.com/llvm/llvm-project/issues/165088.
Closes https://github.com/llvm/llvm-project/issues/165088.
Detailed description of the cycle:
```
define void @pr165088_cycle_1(i8 %x) {
entry:
%switch = icmp uge i8 %x, 2
%cond1 = icmp ugt i8 %x, 1
%or.cond = and i1 %switch, %cond1
br i1 %or.cond, label %block3, label %block2
block1:
%cond2 = icmp ugt i8 %x, 1
br i1 %cond2, label %block3, label %block2
block2:
br label %block3
block3:
%cond3 = icmp eq i8 %x, 0
br i1 %cond3, label %exit, label %block1
exit:
ret void
}
```
`simplifyBranchOnICmpChain` folds the branch in `entry` to a switch.
Then we get:
```
entry:
switch i8 %x, label %block3 [
i8 1, label %block2
i8 0, label %block2
]
...
```
`performValueComparisonIntoPredecessorFolding` redirects the default
target `block3` into `block1` because `%x` is never zero.
```
entry:
switch i8 %x, label %block1 [
i8 1, label %block2
i8 0, label %block2
]
...
```
Then `turnSwitchRangeIntoICmp` will convert the switch back into a
branch on icmp.
```
entry:
%switch = icmp ult i8 %x, 2
br i1 %switch, label %block2, label %block1
...
```
Since `block1` and `block2` share the same successor `block3`,
`performBranchToCommonDestFolding` merges the conditions of `entry` and
`block1`, resulting in the original pattern again.
Diffstat (limited to 'lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp')
0 files changed, 0 insertions, 0 deletions
