Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / vararg-ilp32e.ll
blobc45eb3738e6e2f971d950998ce2de93aaa17e266
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(i8*)
8 declare void @llvm.va_end(i8*)
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:    addi sp, sp, 8
29 ; ILP32E-NEXT:    ret
31 ; ILP32E-WITHFP-LABEL: caller:
32 ; ILP32E-WITHFP:       # %bb.0: # %entry
33 ; ILP32E-WITHFP-NEXT:    addi sp, sp, -12
34 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 12
35 ; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
36 ; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
37 ; ILP32E-WITHFP-NEXT:    sw s1, 0(sp) # 4-byte Folded Spill
38 ; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -4
39 ; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -8
40 ; ILP32E-WITHFP-NEXT:    .cfi_offset s1, -12
41 ; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
42 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 0
43 ; ILP32E-WITHFP-NEXT:    mv s1, a0
44 ; ILP32E-WITHFP-NEXT:    li a0, 1
45 ; ILP32E-WITHFP-NEXT:    lui a2, 262144
46 ; ILP32E-WITHFP-NEXT:    li a1, 0
47 ; ILP32E-WITHFP-NEXT:    call va_double
48 ; ILP32E-WITHFP-NEXT:    mv a0, s1
49 ; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
50 ; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
51 ; ILP32E-WITHFP-NEXT:    lw s1, 0(sp) # 4-byte Folded Reload
52 ; ILP32E-WITHFP-NEXT:    addi sp, sp, 12
53 ; ILP32E-WITHFP-NEXT:    ret
54 entry:
55   call void (i32, ...) @va_double(i32 1, double 2.000000e+00)
56   ret i32 %a
59 define void @va_double(i32 %n, ...) {
60 ; ILP32E-LABEL: va_double:
61 ; ILP32E:       # %bb.0: # %entry
62 ; ILP32E-NEXT:    addi sp, sp, -32
63 ; ILP32E-NEXT:    .cfi_def_cfa_offset 32
64 ; ILP32E-NEXT:    sw ra, 4(sp) # 4-byte Folded Spill
65 ; ILP32E-NEXT:    .cfi_offset ra, -28
66 ; ILP32E-NEXT:    sw a5, 28(sp)
67 ; ILP32E-NEXT:    sw a4, 24(sp)
68 ; ILP32E-NEXT:    sw a3, 20(sp)
69 ; ILP32E-NEXT:    sw a2, 16(sp)
70 ; ILP32E-NEXT:    sw a1, 12(sp)
71 ; ILP32E-NEXT:    addi a0, sp, 12
72 ; ILP32E-NEXT:    sw a0, 0(sp)
73 ; ILP32E-NEXT:    addi a0, sp, 19
74 ; ILP32E-NEXT:    andi a1, a0, -8
75 ; ILP32E-NEXT:    addi a0, a1, 8
76 ; ILP32E-NEXT:    sw a0, 0(sp)
77 ; ILP32E-NEXT:    lw a0, 0(a1)
78 ; ILP32E-NEXT:    lw a1, 4(a1)
79 ; ILP32E-NEXT:    lui a3, 262144
80 ; ILP32E-NEXT:    li a2, 0
81 ; ILP32E-NEXT:    call __eqdf2
82 ; ILP32E-NEXT:    bnez a0, .LBB1_2
83 ; ILP32E-NEXT:  # %bb.1: # %if.end
84 ; ILP32E-NEXT:    lw ra, 4(sp) # 4-byte Folded Reload
85 ; ILP32E-NEXT:    addi sp, sp, 32
86 ; ILP32E-NEXT:    ret
87 ; ILP32E-NEXT:  .LBB1_2: # %if.then
88 ; ILP32E-NEXT:    call abort
90 ; ILP32E-WITHFP-LABEL: va_double:
91 ; ILP32E-WITHFP:       # %bb.0: # %entry
92 ; ILP32E-WITHFP-NEXT:    addi sp, sp, -36
93 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa_offset 36
94 ; ILP32E-WITHFP-NEXT:    sw ra, 8(sp) # 4-byte Folded Spill
95 ; ILP32E-WITHFP-NEXT:    sw s0, 4(sp) # 4-byte Folded Spill
96 ; ILP32E-WITHFP-NEXT:    .cfi_offset ra, -28
97 ; ILP32E-WITHFP-NEXT:    .cfi_offset s0, -32
98 ; ILP32E-WITHFP-NEXT:    addi s0, sp, 12
99 ; ILP32E-WITHFP-NEXT:    .cfi_def_cfa s0, 24
100 ; ILP32E-WITHFP-NEXT:    sw a5, 20(s0)
101 ; ILP32E-WITHFP-NEXT:    sw a4, 16(s0)
102 ; ILP32E-WITHFP-NEXT:    sw a3, 12(s0)
103 ; ILP32E-WITHFP-NEXT:    sw a2, 8(s0)
104 ; ILP32E-WITHFP-NEXT:    sw a1, 4(s0)
105 ; ILP32E-WITHFP-NEXT:    addi a0, s0, 4
106 ; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
107 ; ILP32E-WITHFP-NEXT:    addi a0, s0, 11
108 ; ILP32E-WITHFP-NEXT:    andi a1, a0, -8
109 ; ILP32E-WITHFP-NEXT:    addi a0, a1, 8
110 ; ILP32E-WITHFP-NEXT:    sw a0, -12(s0)
111 ; ILP32E-WITHFP-NEXT:    lw a0, 0(a1)
112 ; ILP32E-WITHFP-NEXT:    lw a1, 4(a1)
113 ; ILP32E-WITHFP-NEXT:    lui a3, 262144
114 ; ILP32E-WITHFP-NEXT:    li a2, 0
115 ; ILP32E-WITHFP-NEXT:    call __eqdf2
116 ; ILP32E-WITHFP-NEXT:    bnez a0, .LBB1_2
117 ; ILP32E-WITHFP-NEXT:  # %bb.1: # %if.end
118 ; ILP32E-WITHFP-NEXT:    lw ra, 8(sp) # 4-byte Folded Reload
119 ; ILP32E-WITHFP-NEXT:    lw s0, 4(sp) # 4-byte Folded Reload
120 ; ILP32E-WITHFP-NEXT:    addi sp, sp, 36
121 ; ILP32E-WITHFP-NEXT:    ret
122 ; ILP32E-WITHFP-NEXT:  .LBB1_2: # %if.then
123 ; ILP32E-WITHFP-NEXT:    call abort
124 entry:
125   %args = alloca i8*, align 4
126   %args1 = bitcast i8** %args to i8*
127   call void @llvm.va_start(i8* %args1)
128   %argp.cur = load i8*, i8** %args, align 4
129   %0 = ptrtoint i8* %argp.cur to i32
130   %1 = add i32 %0, 7
131   %2 = and i32 %1, -8
132   %argp.cur.aligned = inttoptr i32 %2 to i8*
133   %argp.next = getelementptr inbounds i8, i8* %argp.cur.aligned, i32 8
134   store i8* %argp.next, i8** %args, align 4
135   %3 = bitcast i8* %argp.cur.aligned to double*
136   %4 = load double, double* %3, align 8
137   %cmp = fcmp une double %4, 2.000000e+00
138   br i1 %cmp, label %if.then, label %if.end
140 if.then:
141   call void @abort()
142   unreachable
144 if.end:
145   %args2 = bitcast i8** %args to i8*
146   call void @llvm.va_end(i8* %args2)
147   ret void