[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:55:04 PST 2021
paquette updated this revision to Diff 320918.
paquette added a comment.
Simplify logic
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95895/new/
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,10 +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()))
- return false;
- return true;
+ // 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();
+ return BrCondTarget != MI.getOperand(0).getMBB() &&
+ MBB->isLayoutSuccessor(BrCondTarget);
}
void CombinerHelper::applyOptBrCondByInvertingCond(MachineInstr &MI) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95895.320918.patch
Type: text/x-patch
Size: 1959 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210202/6c3e67ee/attachment.bin>
More information about the llvm-commits
mailing list