diff options
author | XChy <xxs_chy@outlook.com> | 2023-09-25 10:13:45 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-25 10:13:45 +0800 |
commit | fc86d031fec5e47c6811efd3a871742ad244afdd (patch) | |
tree | de6c0e7925395373c9bca56aceec703eb86ca557 /clang/lib/Format/WhitespaceManager.cpp | |
parent | 4c1c96e6fc0f704e9e032f87b2cd1e04bb4240dd (diff) | |
download | llvm-fc86d031fec5e47c6811efd3a871742ad244afdd.zip llvm-fc86d031fec5e47c6811efd3a871742ad244afdd.tar.gz llvm-fc86d031fec5e47c6811efd3a871742ad244afdd.tar.bz2 |
[SimplifyCFG] Transform for redirecting phis between unmergeable BB and SuccBB (#67275)
This patch extends function TryToSimplifyUncondBranchFromEmptyBlock to
handle the similar cases below.
```llvm
define i8 @src(i8 noundef %arg) {
start:
switch i8 %arg, label %unreachable [
i8 0, label %case012
i8 1, label %case1
i8 2, label %case2
i8 3, label %end
]
unreachable:
unreachable
case1:
br label %case012
case2:
br label %case012
case012:
%phi1 = phi i8 [ 3, %case2 ], [ 2, %case1 ], [ 1, %start ]
br label %end
end:
%phi2 = phi i8 [ %phi1, %case012 ], [ 4, %start ]
ret i8 %phi2
}
```
The phis here should be merged into one phi, so that we can better
optimize it:
```llvm
define i8 @tgt(i8 noundef %arg) {
start:
switch i8 %arg, label %unreachable [
i8 0, label %end
i8 1, label %case1
i8 2, label %case2
i8 3, label %case3
]
unreachable:
unreachable
case1:
br label %end
case2:
br label %end
case3:
br label %end
end:
%phi = phi i8 [ 4, %case3 ], [ 3, %case2 ], [ 2, %case1 ], [ 1, %start ]
ret i8 %phi
}
```
Proof:
[normal](https://alive2.llvm.org/ce/z/vAWi88)
[multiple stages](https://alive2.llvm.org/ce/z/DDBQqp)
[multiple stages 2](https://alive2.llvm.org/ce/z/nGkeqN)
[multiple phi combinations](https://alive2.llvm.org/ce/z/VQeEdp)
And lookup table optimization should convert it into add %arg 1.
This patch just match similar CFG structure and merge the phis in
different cases.
Maybe such transform can be applied to other situations besides switch,
but I'm not sure whether it's better than not merging. Therefore, I only
try it in switch,
Related issue:
#63876
[Migrated](https://reviews.llvm.org/D155940)
Diffstat (limited to 'clang/lib/Format/WhitespaceManager.cpp')
0 files changed, 0 insertions, 0 deletions