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 6 7declare void @llvm.va_start(ptr) 8declare void @llvm.va_end(ptr) 9declare void @abort() 10 11define 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 33; 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 62entry: 63 call void (i32, ...) @va_double(i32 1, double 2.000000e+00) 64 ret i32 %a 65} 66 67define 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 101; 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 142entry: 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 157 158if.then: 159 call void @abort() 160 unreachable 161 162if.end: 163 %args2 = bitcast ptr %args to ptr 164 call void @llvm.va_end(ptr %args2) 165 ret void 166} 167