1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2
- ; RUN: llc -mtriple riscv32-unknown-linux-gnu -o - %s | FileCheck %s
3
- ; RUN: llc -mtriple riscv32-unknown-elf -o - %s | FileCheck %s
2
+ ; RUN: llc -mtriple riscv32-unknown-linux-gnu -o - %s \
3
+ ; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-RAS
4
+ ; RUN: llc -mtriple riscv32-unknown-elf -o - %s \
5
+ ; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-RAS
6
+ ; RUN: llc -mtriple riscv32 -mattr=+no-ret-addr-stack -o - %s \
7
+ ; RUN: | FileCheck --check-prefixes=CHECK,CHECK-NO-RAS %s
4
8
5
9
; Perform tail call optimization for global address.
6
10
declare i32 @callee_tail (i32 %i )
@@ -52,19 +56,29 @@ entry:
52
56
declare void @callee_indirect1 ()
53
57
declare void @callee_indirect2 ()
54
58
define void @caller_indirect_tail (i32 %a ) nounwind {
55
- ; CHECK-LABEL: caller_indirect_tail:
56
- ; CHECK: # %bb.0: # %entry
57
- ; CHECK-NEXT: beqz a0, .LBB3_2
58
- ; CHECK-NEXT: # %bb.1: # %entry
59
- ; CHECK-NEXT: lui a0, %hi(callee_indirect2)
60
- ; CHECK-NEXT: addi t1, a0, %lo(callee_indirect2)
61
- ; CHECK-NEXT: jr t1
62
- ; CHECK-NEXT: .LBB3_2:
63
- ; CHECK-NEXT: lui a0, %hi(callee_indirect1)
64
- ; CHECK-NEXT: addi t1, a0, %lo(callee_indirect1)
65
- ; CHECK-NEXT: jr t1
66
-
67
-
59
+ ; CHECK-RAS-LABEL: caller_indirect_tail:
60
+ ; CHECK-RAS: # %bb.0: # %entry
61
+ ; CHECK-RAS-NEXT: beqz a0, .LBB3_2
62
+ ; CHECK-RAS-NEXT: # %bb.1: # %entry
63
+ ; CHECK-RAS-NEXT: lui a0, %hi(callee_indirect2)
64
+ ; CHECK-RAS-NEXT: addi t1, a0, %lo(callee_indirect2)
65
+ ; CHECK-RAS-NEXT: jr t1
66
+ ; CHECK-RAS-NEXT: .LBB3_2:
67
+ ; CHECK-RAS-NEXT: lui a0, %hi(callee_indirect1)
68
+ ; CHECK-RAS-NEXT: addi t1, a0, %lo(callee_indirect1)
69
+ ; CHECK-RAS-NEXT: jr t1
70
+ ;
71
+ ; CHECK-NO-RAS-LABEL: caller_indirect_tail:
72
+ ; CHECK-NO-RAS: # %bb.0: # %entry
73
+ ; CHECK-NO-RAS-NEXT: beqz a0, .LBB3_2
74
+ ; CHECK-NO-RAS-NEXT: # %bb.1: # %entry
75
+ ; CHECK-NO-RAS-NEXT: lui a0, %hi(callee_indirect2)
76
+ ; CHECK-NO-RAS-NEXT: addi t0, a0, %lo(callee_indirect2)
77
+ ; CHECK-NO-RAS-NEXT: jr t0
78
+ ; CHECK-NO-RAS-NEXT: .LBB3_2:
79
+ ; CHECK-NO-RAS-NEXT: lui a0, %hi(callee_indirect1)
80
+ ; CHECK-NO-RAS-NEXT: addi t0, a0, %lo(callee_indirect1)
81
+ ; CHECK-NO-RAS-NEXT: jr t0
68
82
entry:
69
83
%tobool = icmp eq i32 %a , 0
70
84
%callee = select i1 %tobool , ptr @callee_indirect1 , ptr @callee_indirect2
@@ -75,17 +89,30 @@ entry:
75
89
; Make sure we don't use t0 as the source for jr as that is a hint to pop the
76
90
; return address stack on some microarchitectures.
77
91
define i32 @caller_indirect_no_t0 (ptr %0 , i32 %1 , i32 %2 , i32 %3 , i32 %4 , i32 %5 , i32 %6 , i32 %7 ) {
78
- ; CHECK-LABEL: caller_indirect_no_t0:
79
- ; CHECK: # %bb.0:
80
- ; CHECK-NEXT: mv t1, a0
81
- ; CHECK-NEXT: mv a0, a1
82
- ; CHECK-NEXT: mv a1, a2
83
- ; CHECK-NEXT: mv a2, a3
84
- ; CHECK-NEXT: mv a3, a4
85
- ; CHECK-NEXT: mv a4, a5
86
- ; CHECK-NEXT: mv a5, a6
87
- ; CHECK-NEXT: mv a6, a7
88
- ; CHECK-NEXT: jr t1
92
+ ; CHECK-RAS-LABEL: caller_indirect_no_t0:
93
+ ; CHECK-RAS: # %bb.0:
94
+ ; CHECK-RAS-NEXT: mv t1, a0
95
+ ; CHECK-RAS-NEXT: mv a0, a1
96
+ ; CHECK-RAS-NEXT: mv a1, a2
97
+ ; CHECK-RAS-NEXT: mv a2, a3
98
+ ; CHECK-RAS-NEXT: mv a3, a4
99
+ ; CHECK-RAS-NEXT: mv a4, a5
100
+ ; CHECK-RAS-NEXT: mv a5, a6
101
+ ; CHECK-RAS-NEXT: mv a6, a7
102
+ ; CHECK-RAS-NEXT: jr t1
103
+ ;
104
+ ; CHECK-NO-RAS-LABEL: caller_indirect_no_t0:
105
+ ; CHECK-NO-RAS: # %bb.0:
106
+ ; CHECK-NO-RAS-NEXT: mv t0, a0
107
+ ; CHECK-NO-RAS-NEXT: mv a0, a1
108
+ ; CHECK-NO-RAS-NEXT: mv a1, a2
109
+ ; CHECK-NO-RAS-NEXT: mv a2, a3
110
+ ; CHECK-NO-RAS-NEXT: mv a3, a4
111
+ ; CHECK-NO-RAS-NEXT: mv a4, a5
112
+ ; CHECK-NO-RAS-NEXT: mv a5, a6
113
+ ; CHECK-NO-RAS-NEXT: mv a6, a7
114
+ ; CHECK-NO-RAS-NEXT: jr t0
115
+
89
116
%9 = tail call i32 %0 (i32 %1 , i32 %2 , i32 %3 , i32 %4 , i32 %5 , i32 %6 , i32 %7 )
90
117
ret i32 %9
91
118
}
0 commit comments