Chen Zheng eb7d16ea25 [PowerPC] make expensive mflr be away from its user in the function prologue
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
2022-11-14 21:14:20 -05:00

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()