Skip to content

Commit 04377a8

Browse files
author
Zheng Chen
committed
[Powerpc] set instruction count as lsr first priority of lsr.
On Powerpc, set instruction count as lsr first priority of lsr by default. Add an option ppc-lsr-no-insns-cost to return back to default lsr cost model. Reviewed By: steven.zhang, jsji Differential Revision: https://reviews.llvm.org/D72683
1 parent fb44b9d commit 04377a8

File tree

5 files changed

+52
-20
lines changed

5 files changed

+52
-20
lines changed

llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ EnablePPCColdCC("ppc-enable-coldcc", cl::Hidden, cl::init(false),
3333
cl::desc("Enable using coldcc calling conv for cold "
3434
"internal functions"));
3535

36+
static cl::opt<bool>
37+
LsrNoInsnsCost("ppc-lsr-no-insns-cost", cl::Hidden, cl::init(false),
38+
cl::desc("Do not add instruction count to lsr cost model"));
39+
3640
// The latency of mtctr is only justified if there are more than 4
3741
// comparisons that will be removed as a result.
3842
static cl::opt<unsigned>
@@ -967,3 +971,16 @@ bool PPCTTIImpl::canSaveCmp(Loop *L, BranchInst **BI, ScalarEvolution *SE,
967971
*BI = HWLoopInfo.ExitBranch;
968972
return true;
969973
}
974+
975+
bool PPCTTIImpl::isLSRCostLess(TargetTransformInfo::LSRCost &C1,
976+
TargetTransformInfo::LSRCost &C2) {
977+
// PowerPC default behaviour here is "instruction number 1st priority".
978+
// If LsrNoInsnsCost is set, call default implementation.
979+
if (!LsrNoInsnsCost)
980+
return std::tie(C1.Insns, C1.NumRegs, C1.AddRecCost, C1.NumIVMuls,
981+
C1.NumBaseAdds, C1.ScaleCost, C1.ImmCost, C1.SetupCost) <
982+
std::tie(C2.Insns, C2.NumRegs, C2.AddRecCost, C2.NumIVMuls,
983+
C2.NumBaseAdds, C2.ScaleCost, C2.ImmCost, C2.SetupCost);
984+
else
985+
return TargetTransformInfoImplBase::isLSRCostLess(C1, C2);
986+
}

llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class PPCTTIImpl : public BasicTTIImplBase<PPCTTIImpl> {
6363
TargetLibraryInfo *LibInfo);
6464
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
6565
TTI::UnrollingPreferences &UP);
66+
bool isLSRCostLess(TargetTransformInfo::LSRCost &C1,
67+
TargetTransformInfo::LSRCost &C2);
6668

6769
/// @}
6870

llvm/test/CodeGen/PowerPC/addi-licm.ll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ entry:
1717
; CHECK-LABEL: @foo
1818
; CHECK: addi [[REG1:[0-9]+]], 1,
1919
; CHECK: addi [[REG2:[0-9]+]], 1,
20+
; CHECK: li [[REG3:[0-9]+]], 0
2021
; CHECK: %for.body.i
21-
; CHECK-DAG: lfs {{[0-9]+}}, 0([[REG1]])
22-
; CHECK-DAG: lfs {{[0-9]+}}, 0([[REG2]])
22+
; CHECK-DAG: lfsx {{[0-9]+}}, [[REG1]], [[REG3]]
23+
; CHECK-DAG: lfsx {{[0-9]+}}, [[REG2]], [[REG3]]
2324
; CHECK: blr
2425

2526
; PIP-LABEL: @foo

llvm/test/CodeGen/PowerPC/lsr-insns-cost.ll

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs < %s \
2-
; RUN: -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s
1+
; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs < %s \
2+
; RUN: -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s -check-prefix=INST
3+
; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs -ppc-lsr-no-insns-cost=true \
4+
; RUN: < %s -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s -check-prefix=REG
35

46
; void test(unsigned *a, unsigned *b, unsigned *c)
57
; {
@@ -10,16 +12,25 @@
1012
; compile with -fno-unroll-loops
1113

1214
define void @lsr-insts-cost(i32* %0, i32* %1, i32* %2) {
13-
; CHECK-LABEL: lsr-insts-cost
14-
; CHECK: .LBB0_4: # =>This Inner Loop Header: Depth=1
15-
; CHECK-NEXT: lxvd2x vs34, 0, r3
16-
; CHECK-NEXT: lxvd2x vs35, 0, r4
17-
; CHECK-NEXT: addi r4, r4, 16
18-
; CHECK-NEXT: addi r3, r3, 16
19-
; CHECK-NEXT: vadduwm v2, v3, v2
20-
; CHECK-NEXT: stxvd2x vs34, 0, r5
21-
; CHECK-NEXT: addi r5, r5, 16
22-
; CHECK-NEXT: bdnz .LBB0_4
15+
; INST-LABEL: lsr-insts-cost
16+
; INST: .LBB0_4: # =>This Inner Loop Header: Depth=1
17+
; INST-NEXT: lxvd2x vs34, r3, r6
18+
; INST-NEXT: lxvd2x vs35, r4, r6
19+
; INST-NEXT: vadduwm v2, v3, v2
20+
; INST-NEXT: stxvd2x vs34, r5, r6
21+
; INST-NEXT: addi r6, r6, 16
22+
; INST-NEXT: bdnz .LBB0_4
23+
;
24+
; REG-LABEL: lsr-insts-cost
25+
; REG: .LBB0_4: # =>This Inner Loop Header: Depth=1
26+
; REG-NEXT: lxvd2x vs34, 0, r3
27+
; REG-NEXT: lxvd2x vs35, 0, r4
28+
; REG-NEXT: addi r4, r4, 16
29+
; REG-NEXT: addi r3, r3, 16
30+
; REG-NEXT: vadduwm v2, v3, v2
31+
; REG-NEXT: stxvd2x vs34, 0, r5
32+
; REG-NEXT: addi r5, r5, 16
33+
; REG-NEXT: bdnz .LBB0_4
2334
%4 = getelementptr i32, i32* %2, i64 1024
2435
%5 = getelementptr i32, i32* %0, i64 1024
2536
%6 = getelementptr i32, i32* %1, i64 1024

llvm/test/CodeGen/PowerPC/unal-altivec.ll

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ vector.body: ; preds = %vector.body, %vecto
2929
br i1 %10, label %for.end, label %vector.body
3030

3131
; CHECK: @foo
32-
; CHECK-DAG: li [[C16:[0-9]+]], 16
32+
; CHECK-DAG: li [[C0:[0-9]+]], 0
3333
; CHECK-DAG: lvx [[CNST:[0-9]+]],
3434
; CHECK: .LBB0_1:
35-
; CHECK-DAG: lvx [[LD1:[0-9]+]], 0, [[C0:[0-9]+]]
36-
; CHECK-DAG: lvx [[LD2:[0-9]+]], [[C0]], [[C16]]
37-
; CHECK-DAG: lvsl [[MASK1:[0-9]+]], 0, [[C0]]
38-
; CHECK-DAG: vperm [[VR1:[0-9]+]], [[LD1]], [[LD2]], [[MASK1]]
39-
; CHECK-DAG: vaddfp {{[0-9]+}}, [[VR1]], [[CNST]]
35+
; CHECK-DAG: lvsl [[MASK1:[0-9]+]], [[B1:[0-9]+]], [[C0]]
36+
; CHECK-DAG: add [[B3:[0-9]+]], [[B1]], [[C0]]
37+
; CHECK-DAG: lvx [[LD1:[0-9]+]], [[B1]], [[C0]]
38+
; CHECK-DAG: lvx [[LD2:[0-9]+]], [[B3]],
39+
; CHECK-DAG: vperm [[R1:[0-9]+]], [[LD1]], [[LD2]], [[MASK1]]
40+
; CHECK-DAG: vaddfp {{[0-9]+}}, [[R1]], [[CNST]]
4041
; CHECK: blr
4142

4243
for.end: ; preds = %vector.body

0 commit comments

Comments
 (0)