[PATCH] D95895: [GlobalISel] Check if branches use the same MBB in matchOptBrCondByInvertingCond
Jessica Paquette via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 2 14:26:07 PST 2021
paquette created this revision.
paquette added reviewers: aemerson, arsenm.
Herald added subscribers: hiraditya, rovka.
paquette requested review of this revision.
Herald added a subscriber: wdng.
Herald added a project: LLVM.
If the G_BR + G_BRCOND in this combine use the same MBB, then it will infinite loop. Don't allow that to happen.
https://reviews.llvm.org/D95895
Files:
llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-br.mir
Index: llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-br.mir
===================================================================
--- llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-br.mir
+++ llvm/test/CodeGen/AArch64/GlobalISel/prelegalizercombiner-br.mir
@@ -29,6 +29,7 @@
ret i32 %retval.0
}
+ define void @dont_combine_same_block() { ret void }
...
---
@@ -87,3 +88,26 @@
RET_ReallyLR implicit $w0
...
+---
+name: dont_combine_same_block
+tracksRegLiveness: true
+body: |
+ ; CHECK-LABEL: name: dont_combine_same_block
+ ; CHECK: bb.0:
+ ; CHECK: successors: %bb.1(0x80000000)
+ ; CHECK: liveins: $w0, $w1
+ ; CHECK: %cond:_(s1) = G_IMPLICIT_DEF
+ ; CHECK: G_BRCOND %cond(s1), %bb.1
+ ; CHECK: G_BR %bb.1
+ ; CHECK: bb.1:
+ ; CHECK: RET_ReallyLR
+ bb.0:
+ liveins: $w0, $w1
+ %cond:_(s1) = G_IMPLICIT_DEF
+
+ ; The G_BRCOND and G_BR have the same target here. Don't change anything.
+ G_BRCOND %cond(s1), %bb.1
+ G_BR %bb.1
+ bb.1:
+ RET_ReallyLR
+...
Index: llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -968,8 +968,11 @@
if (BrCond->getOpcode() != TargetOpcode::G_BRCOND)
return false;
- // Check that the next block is the conditional branch target.
- if (!MBB->isLayoutSuccessor(BrCond->getOperand(1).getMBB()))
+ // Check that the next block is the conditional branch target. Also make sure
+ // that it isn't the same as the G_BR's target (otherwise, this will loop.)
+ MachineBasicBlock *BrCondTarget = BrCond->getOperand(1).getMBB();
+ if (!MBB->isLayoutSuccessor(BrCondTarget) ||
+ BrCondTarget == MI.getOperand(0).getMBB())
return false;
return true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95895.320906.patch
Type: text/x-patch
Size: 1879 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210202/da3e3366/attachment.bin>
More information about the llvm-commits
mailing list