[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / RISCV / vararg-ilp32e.ll
blob91999444fa766579d405bde038d4207a451162e7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -target-abi ilp32e -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck -check-prefix=ILP32E %s
4 ; RUN: llc -mtriple=riscv32 -target-abi ilp32e -frame-pointer=all -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck -check-prefix=ILP32E-WITHFP %s
7 declare void @llvm.va_start(ptr)
8 declare void @llvm.va_end(ptr)
9 declare void @abort()
11 define i32 @caller(i32 %a) {
12 ; ILP32E-LABEL: caller:
13 ; ILP32E:       # %bb.0: # %entry
14 ; ILP32E-NEXT:    addi sp, sp, -8
15 ; ILP32E-NEXT:    .cfi_def_cfa_offset 8
16 ; ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
17 ; ILP32E-NEXT:    sw s0, 0(sp) # 4-byte Folded Spill
18 ; ILP32E-NEXT:    .cfi_offset ra, -4
19 ; ILP32E-NEXT:    .cfi_offset s0, -8
20 ; ILP32E-NEXT:    mv s0, a0
21 ; ILP32E-NEXT:    li a0, 1
22 ; ILP32E-NEXT:    lui a2, 262144
23 ; ILP32E-NEXT:    li a1, 0
24 ; ILP32E-NEXT:    call va_double
25 ; ILP32E-NEXT:    mv a0, s0
26 ; ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
27 ; ILP32E-NEXT:    lw s0, 0(sp) # 4-byte Folded Reload
28 ; ILP32E-NEXT:    .cfi_restore ra
29 ; ILP32E-NEXT:    .cfi_restore s0
30 ; ILP32E-NEXT:    addi sp, sp, 8
31 ; ILP32E-NEXT:    .cfi_def_cfa_offset 0
32 ; ILP32E-NEXT:    ret
34 ; ILP32E-WITHFP-LABEL: caller:
35 ; ILP32E-WITHFP:       # %bb.0: # %entry
36 ; ILP32E-WITHFP-NEXT:    addi sp, sp, -12
37 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 12
38 ; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
39 ; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
40 ; ILP32E-WITHFP-NEXT:    sw s1, 0(sp) # 4-byte Folded Spill
41 ; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
42 ; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
43 ; ILP32E-WITHFP-NEXT:    .cfi_offset s1, -12
44 ; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
45 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
46 ; ILP32E-WITHFP-NEXT:    mv s1, a0
47 ; ILP32E-WITHFP-NEXT:    li a0, 1
48 ; ILP32E-WITHFP-NEXT:    lui a2, 262144
49 ; ILP32E-WITHFP-NEXT:    li a1, 0
50 ; ILP32E-WITHFP-NEXT:    call va_double
51 ; ILP32E-WITHFP-NEXT:    mv a0, s1
52 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 12
53 ; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
54 ; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
55 ; ILP32E-WITHFP-NEXT:    lw s1, 0(sp) # 4-byte Folded Reload
56 ; ILP32E-WITHFP-NEXT:    .cfi_restore ra
57 ; ILP32E-WITHFP-NEXT:    .cfi_restore s0
58 ; ILP32E-WITHFP-NEXT:    .cfi_restore s1
59 ; ILP32E-WITHFP-NEXT:    addi sp, sp, 12
60 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
61 ; ILP32E-WITHFP-NEXT:    ret
62 entry:
63   call void (i32, ...) @va_double(i32 1, double 2.000000e+00)
64   ret i32 %a
67 define void @va_double(i32 %n, ...) {
68 ; ILP32E-LABEL: va_double:
69 ; ILP32E:       # %bb.0: # %entry
70 ; ILP32E-NEXT:    addi sp, sp, -32
71 ; ILP32E-NEXT:    .cfi_def_cfa_offset 32
72 ; ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
73 ; ILP32E-NEXT:    .cfi_offset ra, -28
74 ; ILP32E-NEXT:    .cfi_remember_state
75 ; ILP32E-NEXT:    sw a5, 28(sp)
76 ; ILP32E-NEXT:    sw a1, 12(sp)
77 ; ILP32E-NEXT:    sw a2, 16(sp)
78 ; ILP32E-NEXT:    sw a3, 20(sp)
79 ; ILP32E-NEXT:    sw a4, 24(sp)
80 ; ILP32E-NEXT:    addi a0, sp, 12
81 ; ILP32E-NEXT:    addi a1, sp, 19
82 ; ILP32E-NEXT:    sw a0, 0(sp)
83 ; ILP32E-NEXT:    andi a1, a1, -8
84 ; ILP32E-NEXT:    addi a0, a1, 8
85 ; ILP32E-NEXT:    sw a0, 0(sp)
86 ; ILP32E-NEXT:    lw a0, 0(a1)
87 ; ILP32E-NEXT:    lw a1, 4(a1)
88 ; ILP32E-NEXT:    lui a3, 262144
89 ; ILP32E-NEXT:    li a2, 0
90 ; ILP32E-NEXT:    call __eqdf2
91 ; ILP32E-NEXT:    bnez a0, .LBB1_2
92 ; ILP32E-NEXT:  # %bb.1: # %if.end
93 ; ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
94 ; ILP32E-NEXT:    .cfi_restore ra
95 ; ILP32E-NEXT:    addi sp, sp, 32
96 ; ILP32E-NEXT:    .cfi_def_cfa_offset 0
97 ; ILP32E-NEXT:    ret
98 ; ILP32E-NEXT:  .LBB1_2: # %if.then
99 ; ILP32E-NEXT:    .cfi_restore_state
100 ; ILP32E-NEXT:    call abort
102 ; ILP32E-WITHFP-LABEL: va_double:
103 ; ILP32E-WITHFP:       # %bb.0: # %entry
104 ; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
105 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 36
106 ; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
107 ; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
108 ; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -28
109 ; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -32
110 ; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
111 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 24
112 ; ILP32E-WITHFP-NEXT:    .cfi_remember_state
113 ; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
114 ; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
115 ; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
116 ; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
117 ; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
118 ; ILP32E-WITHFP-NEXT:    addi a0, s0, 4
119 ; ILP32E-WITHFP-NEXT:    addi a1, s0, 11
120 ; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
121 ; ILP32E-WITHFP-NEXT:    andi a1, a1, -8
122 ; ILP32E-WITHFP-NEXT:    addi a0, a1, 8
123 ; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
124 ; ILP32E-WITHFP-NEXT:    lw a0, 0(a1)
125 ; ILP32E-WITHFP-NEXT:    lw a1, 4(a1)
126 ; ILP32E-WITHFP-NEXT:    lui a3, 262144
127 ; ILP32E-WITHFP-NEXT:    li a2, 0
128 ; ILP32E-WITHFP-NEXT:    call __eqdf2
129 ; ILP32E-WITHFP-NEXT:    bnez a0, .LBB1_2
130 ; ILP32E-WITHFP-NEXT:  # %bb.1: # %if.end
131 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa sp, 36
132 ; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
133 ; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
134 ; ILP32E-WITHFP-NEXT:    .cfi_restore ra
135 ; ILP32E-WITHFP-NEXT:    .cfi_restore s0
136 ; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
137 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 0
138 ; ILP32E-WITHFP-NEXT:    ret
139 ; ILP32E-WITHFP-NEXT:  .LBB1_2: # %if.then
140 ; ILP32E-WITHFP-NEXT:    .cfi_restore_state
141 ; ILP32E-WITHFP-NEXT:    call abort
142 entry:
143   %args = alloca ptr, align 4
144   %args1 = bitcast ptr %args to ptr
145   call void @llvm.va_start(ptr %args1)
146   %argp.cur = load ptr, ptr %args, align 4
147   %0 = ptrtoint ptr %argp.cur to i32
148   %1 = add i32 %0, 7
149   %2 = and i32 %1, -8
150   %argp.cur.aligned = inttoptr i32 %2 to ptr
151   %argp.next = getelementptr inbounds i8, ptr %argp.cur.aligned, i32 8
152   store ptr %argp.next, ptr %args, align 4
153   %3 = bitcast ptr %argp.cur.aligned to ptr
154   %4 = load double, ptr %3, align 8
155   %cmp = fcmp une double %4, 2.000000e+00
156   br i1 %cmp, label %if.then, label %if.end
158 if.then:
159   call void @abort()
160   unreachable
162 if.end:
163   %args2 = bitcast ptr %args to ptr
164   call void @llvm.va_end(ptr %args2)
165   ret void