
mflr is kind of expensive on Power version smaller than 10, so we should schedule the store for the mflr's def away from mflr. In epilogue, the expensive mtlr has no user for its def, so it doesn't matter that the load and the mtlr are back-to-back. Reviewed By: RolandF Differential Revision: https://reviews.llvm.org/D137423
94 lines
1.9 KiB
LLVM
94 lines
1.9 KiB
LLVM
; RUN: llc -O2 < %s | FileCheck %s
|
|
|
|
target triple = "powerpc64le-grtev4-linux-gnu"
|
|
|
|
; No duplication of loop header into entry block.
|
|
define void @no_duplicate1(i64 %a) {
|
|
; CHECK-LABEL: no_duplicate1
|
|
; CHECK: mr 30, 3
|
|
; CHECK-NEXT: std 0, 64(1)
|
|
; CHECK-NEXT: b .LBB0_2
|
|
|
|
; CHECK: .LBB0_2:
|
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: cmpldi 30, 100
|
|
; CHECK-NEXT: bne 0, .LBB0_1
|
|
entry:
|
|
br label %header
|
|
|
|
header:
|
|
%ind = phi i64 [%a, %entry], [%val3, %latch]
|
|
%cond1 = icmp eq i64 %ind, 100
|
|
br i1 %cond1, label %middle, label %latch
|
|
|
|
middle:
|
|
%condx = call i1 @foo()
|
|
%val1 = xor i64 %ind, 2
|
|
br label %latch
|
|
|
|
latch:
|
|
%val2 = phi i64 [%ind, %header], [%val1, %middle]
|
|
%val3 = add i64 %val2, 1
|
|
%cond2 = call i1 @foo()
|
|
br i1 %cond2, label %end, label %header
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
; No duplication of loop header into latches.
|
|
define void @no_duplicate2(i64 %a) {
|
|
; CHECK-LABEL: no_duplicate2
|
|
; CHECK: mr 30, 3
|
|
; CHECK-NEXT: std 0, 64(1)
|
|
; CHECK-NEXT: b .LBB1_2
|
|
|
|
; CHECK: .LBB1_2:
|
|
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: cmpldi 30, 100
|
|
; CHECK-NEXT: bne 0, .LBB1_1
|
|
|
|
; CHECK: %latch2
|
|
; CHECK: b .LBB1_2
|
|
|
|
; CHECK: %latch3
|
|
; CHECK: b .LBB1_2
|
|
entry:
|
|
br label %header
|
|
|
|
header:
|
|
%ind = phi i64 [%a, %entry], [%val1, %latch1], [%val2, %latch2], [%val2, %latch3]
|
|
%cond1 = icmp eq i64 %ind, 100
|
|
br i1 %cond1, label %middle1, label %latch1
|
|
|
|
latch1:
|
|
%cond2 = call i1 @foo()
|
|
%val1 = xor i64 %ind, 2
|
|
br i1 %cond2, label %end, label %header
|
|
|
|
middle1:
|
|
%cond3 = call i1 @foo()
|
|
br i1 %cond3, label %latch1, label %middle2
|
|
|
|
middle2:
|
|
%cond4 = call i1 @foo()
|
|
%val2 = add i64 %ind, 1
|
|
br i1 %cond4, label %latch2, label %latch3
|
|
|
|
latch2:
|
|
call void @a()
|
|
br label %header
|
|
|
|
latch3:
|
|
call void @b()
|
|
br label %header
|
|
|
|
end:
|
|
ret void
|
|
}
|
|
|
|
|
|
declare i1 @foo()
|
|
declare void @a()
|
|
declare void @b()
|