Skip to content

Commit e8c4438

Browse files
committed
[RISCV] Precommit test for tail duplication
1 parent 430b90f commit e8c4438

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=riscv64 -mattr=+m -O2 < %s | FileCheck %s --check-prefix=CHECK-O2
3+
; RUN: llc -mtriple=riscv64 -mattr=+m -O3 < %s | FileCheck %s --check-prefix=CHECK-O3
4+
5+
; RUN: llc -mtriple=riscv64 -mattr=+m -tail-dup-size=4 < %s | FileCheck %s --check-prefix=CHECK-O2
6+
; RUN: llc -mtriple=riscv64 -mattr=+m -tail-dup-placement-threshold=4 < %s | FileCheck %s --check-prefix=CHECK-O2
7+
; RUN: llc -mtriple=riscv64 -mattr=+m -tail-dup-placement-threshold=4 < %s | FileCheck %s --check-prefix=CHECK-O3
8+
9+
@a = external dso_local local_unnamed_addr global i32
10+
@b = external dso_local local_unnamed_addr global i32
11+
@c = external dso_local local_unnamed_addr global i32
12+
13+
declare i32 @foo(i32)
14+
15+
define dso_local i32 @test(i32 %n) {
16+
; CHECK-O2-LABEL: test:
17+
; CHECK-O2: # %bb.0: # %entry
18+
; CHECK-O2-NEXT: sext.w a1, a0
19+
; CHECK-O2-NEXT: blez a1, .LBB0_2
20+
; CHECK-O2-NEXT: # %bb.1: # %if.then
21+
; CHECK-O2-NEXT: lui a1, %hi(a)
22+
; CHECK-O2-NEXT: lw a1, %lo(a)(a1)
23+
; CHECK-O2-NEXT: mul a0, a1, a0
24+
; CHECK-O2-NEXT: j .LBB0_3
25+
; CHECK-O2-NEXT: .LBB0_2: # %if.else
26+
; CHECK-O2-NEXT: lui a1, %hi(b)
27+
; CHECK-O2-NEXT: lw a1, %lo(b)(a1)
28+
; CHECK-O2-NEXT: divw a0, a1, a0
29+
; CHECK-O2-NEXT: .LBB0_3: # %if.end
30+
; CHECK-O2-NEXT: lui a1, %hi(c)
31+
; CHECK-O2-NEXT: lw a1, %lo(c)(a1)
32+
; CHECK-O2-NEXT: addi a0, a0, -1
33+
; CHECK-O2-NEXT: mulw a0, a0, a1
34+
; CHECK-O2-NEXT: tail foo
35+
;
36+
; CHECK-O3-LABEL: test:
37+
; CHECK-O3: # %bb.0: # %entry
38+
; CHECK-O3-NEXT: sext.w a1, a0
39+
; CHECK-O3-NEXT: blez a1, .LBB0_2
40+
; CHECK-O3-NEXT: # %bb.1: # %if.then
41+
; CHECK-O3-NEXT: lui a1, %hi(a)
42+
; CHECK-O3-NEXT: lw a1, %lo(a)(a1)
43+
; CHECK-O3-NEXT: mul a0, a1, a0
44+
; CHECK-O3-NEXT: j .LBB0_3
45+
; CHECK-O3-NEXT: .LBB0_2: # %if.else
46+
; CHECK-O3-NEXT: lui a1, %hi(b)
47+
; CHECK-O3-NEXT: lw a1, %lo(b)(a1)
48+
; CHECK-O3-NEXT: divw a0, a1, a0
49+
; CHECK-O3-NEXT: .LBB0_3: # %if.end
50+
; CHECK-O3-NEXT: lui a1, %hi(c)
51+
; CHECK-O3-NEXT: lw a1, %lo(c)(a1)
52+
; CHECK-O3-NEXT: addi a0, a0, -1
53+
; CHECK-O3-NEXT: mulw a0, a0, a1
54+
; CHECK-O3-NEXT: tail foo
55+
entry:
56+
%cmp = icmp sgt i32 %n, 0
57+
br i1 %cmp, label %if.then, label %if.else
58+
59+
if.then:
60+
%va = load i32, ptr @a
61+
%mul = mul nsw i32 %va, %n
62+
br label %if.end
63+
64+
if.else:
65+
%vb = load i32, ptr @b
66+
%div = sdiv i32 %vb, %n
67+
br label %if.end
68+
69+
if.end:
70+
%phi = phi i32 [ %mul, %if.then ], [ %div, %if.else ]
71+
%vc = load i32, ptr @c
72+
%add = add nsw i32 %phi, -1
73+
%arg = mul i32 %add, %vc
74+
%ret = tail call i32 @foo(i32 %arg)
75+
ret i32 %ret
76+
}

0 commit comments

Comments
 (0)