mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
ccd9bcca14
if-conversion. The RemoveExtraEdges function doesn't work for blocks that end with unanalyzable branches, so in those cases, the "extra" edges must be explicitly removed. The CopyAndPredicateBlock and MergeBlocks methods can also avoid copying successor edges due to branches that have already been removed. The latter case is especially helpful when MergeBlocks is called for handling "diamond" if-conversions, where otherwise you can end up with some weird intermediate states in the CFG. Unfortunately I've been unable to find cases where this cleanup actually makes a significant difference in the code. There is one test where we manage to remove an empty block at the end of a function. Radar 6911268. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106939 91177308-0d34-0410-b5e6-96231b3b80d8
33 lines
1.1 KiB
LLVM
33 lines
1.1 KiB
LLVM
; RUN: llc < %s -mtriple=thumbv7-apple-darwin | FileCheck %s
|
|
|
|
; There shouldn't be a unconditional branch at end of bb52.
|
|
; rdar://7184787
|
|
|
|
@posed = external global i64 ; <i64*> [#uses=1]
|
|
|
|
define i1 @ab_bb52(i64 %.reload78, i64* %.out, i64* %.out1) nounwind {
|
|
newFuncRoot:
|
|
br label %bb52
|
|
|
|
bb52.bb55_crit_edge.exitStub: ; preds = %bb52
|
|
store i64 %0, i64* %.out
|
|
store i64 %2, i64* %.out1
|
|
ret i1 true
|
|
|
|
bb52.bb53_crit_edge.exitStub: ; preds = %bb52
|
|
store i64 %0, i64* %.out
|
|
store i64 %2, i64* %.out1
|
|
ret i1 false
|
|
|
|
bb52: ; preds = %newFuncRoot
|
|
; CHECK: movne
|
|
; CHECK: moveq
|
|
; CHECK: pop
|
|
; CHECK-NEXT: @ BB#1:
|
|
%0 = load i64* @posed, align 4 ; <i64> [#uses=3]
|
|
%1 = sub i64 %0, %.reload78 ; <i64> [#uses=1]
|
|
%2 = ashr i64 %1, 1 ; <i64> [#uses=3]
|
|
%3 = icmp eq i64 %2, 0 ; <i1> [#uses=1]
|
|
br i1 %3, label %bb52.bb55_crit_edge.exitStub, label %bb52.bb53_crit_edge.exitStub
|
|
}
|