Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
[IfConversion] Add missing check in IfConversion/canFallThroughTo
Browse files Browse the repository at this point in the history
Summary:
When trying to figure out if MBB could fallthrough to ToMBB (possibly by
falling through a bunch of other MBBs) we didn't actually check if there
was fallthrough between the last two blocks in the chain.

Reviewers: kparzysz, iteratee, MatzeB

Reviewed By: kparzysz, iteratee

Subscribers: javed.absar, llvm-commits

Differential Revision: https://reviews.llvm.org/D32996

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302650 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
mikaelholmen committed May 10, 2017
1 parent 344c4f2 commit f45bea4
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/CodeGen/IfConversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1318,7 +1318,8 @@ static bool canFallThroughTo(MachineBasicBlock &MBB, MachineBasicBlock &ToMBB) {
return false;
PI = I++;
}
return true;
// Finally see if the last I is indeed a successor to PI.
return PI->isSuccessor(&*I);
}

/// Invalidate predecessor BB info so it would be re-analyzed to determine if it
Expand Down
64 changes: 64 additions & 0 deletions test/CodeGen/MIR/ARM/ifcvt_canFallThroughTo.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# RUN: llc -mtriple=arm-apple-ios -o - %s -run-pass if-converter | FileCheck %s
---
name: f1
body: |
bb.0:
successors: %bb.1
B %bb.1
bb.1:
successors: %bb.2, %bb.4
Bcc %bb.4, 1, %cpsr
bb.2:
successors: %bb.3, %bb.5
Bcc %bb.5, 1, %cpsr
bb.3:
successors: %bb.5
B %bb.5
bb.4:
successors:
bb.5:
successors: %bb.1, %bb.6
Bcc %bb.1, 1, %cpsr
bb.6:
BX_RET 14, _
...

# IfConversion.cpp/canFallThroughTo thought there was a fallthrough from
# bb.4 to bb5 even if the successor list was empty.
# bb.4 is empty, so it surely looks like it can fallthrough, but this is what
# happens for a bb just containing an "unreachable".

#CHECK: body: |
#CHECK: bb.0:
#CHECK: successors: %bb.1

#CHECK: bb.1:
#CHECK: successors: %bb.3({{.*}}), %bb.2

# The original brr_cond from bb.1, jumping to the empty bb
#CHECK: Bcc %bb.2
#CHECK: B %bb.3

# Empty bb.2, originally containing "unreachable" and thus has no successors
#CHECK: bb.2:
#CHECK-NOT: successors

#CHECK: bb.3:
#CHECK: successors: %bb.1

# Conditional BX_RET and then loop back to bb.1
#CHECK: BX_RET 0
#CHECK: B %bb.1

0 comments on commit f45bea4

Please sign in to comment.