; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc < %s --mtriple=xtensa | FileCheck %s define void @vararg(...) { ; CHECK-LABEL: vararg: ; CHECK: .cfi_startproc ; CHECK-NEXT: # %bb.0: # %entry ; CHECK-NEXT: addi a8, a1, -32 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: .cfi_def_cfa_offset 32 ; CHECK-NEXT: s32i a7, a1, 20 ; CHECK-NEXT: s32i a6, a1, 16 ; CHECK-NEXT: s32i a5, a1, 12 ; CHECK-NEXT: s32i a4, a1, 8 ; CHECK-NEXT: s32i a3, a1, 4 ; CHECK-NEXT: s32i a2, a1, 0 ; CHECK-NEXT: addi a8, a1, 32 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: ret entry: ret void } declare void @llvm.va_start(ptr) nounwind declare void @llvm.va_end(ptr) nounwind declare void @f_i32(i32) nounwind declare void @f_i64(i64) nounwind define void @vararg_fixed_0(...) nounwind { ; CHECK-LABEL: vararg_fixed_0: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: addi a8, a1, -48 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: s32i a0, a1, 8 # 4-byte Folded Spill ; CHECK-NEXT: s32i a12, a1, 4 # 4-byte Folded Spill ; CHECK-NEXT: s32i a7, a1, 32 ; CHECK-NEXT: s32i a6, a1, 28 ; CHECK-NEXT: s32i a5, a1, 24 ; CHECK-NEXT: s32i a4, a1, 20 ; CHECK-NEXT: s32i a3, a1, 16 ; CHECK-NEXT: s32i a2, a1, 12 ; CHECK-NEXT: addi a10, a1, 12 ; CHECK-NEXT: s32i a10, a1, 4 ; CHECK-NEXT: addi a8, a1, 48 ; CHECK-NEXT: addi a8, a8, -32 ; CHECK-NEXT: s32i a8, a1, 0 ; CHECK-NEXT: movi a9, 4 ; CHECK-NEXT: movi a12, 24 ; CHECK-NEXT: blt a12, a9, .LBB1_2 ; CHECK-NEXT: # %bb.1: # %entry ; CHECK-NEXT: or a8, a10, a10 ; CHECK-NEXT: .LBB1_2: # %entry ; CHECK-NEXT: bge a12, a9, .LBB1_4 ; CHECK-NEXT: # %bb.3: ; CHECK-NEXT: movi a9, 40 ; CHECK-NEXT: .LBB1_4: # %entry ; CHECK-NEXT: s32i a9, a1, 8 ; CHECK-NEXT: add a8, a9, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a2, a8, 0 ; CHECK-NEXT: l32r a8, .LCPI1_0 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a7, a1, 8 ; CHECK-NEXT: addi a10, a7, 4 ; CHECK-NEXT: l32i a9, a1, 4 ; CHECK-NEXT: l32i a8, a1, 0 ; CHECK-NEXT: or a11, a8, a8 ; CHECK-NEXT: blt a12, a10, .LBB1_6 ; CHECK-NEXT: # %bb.5: # %entry ; CHECK-NEXT: or a11, a9, a9 ; CHECK-NEXT: .LBB1_6: # %entry ; CHECK-NEXT: bge a12, a10, .LBB1_8 ; CHECK-NEXT: # %bb.7: ; CHECK-NEXT: addi a10, a7, 40 ; CHECK-NEXT: .LBB1_8: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a10, a10, a11 ; CHECK-NEXT: addi a7, a10, -4 ; CHECK-NEXT: l32i a11, a1, 8 ; CHECK-NEXT: addi a10, a11, 4 ; CHECK-NEXT: blt a12, a10, .LBB1_10 ; CHECK-NEXT: # %bb.9: # %entry ; CHECK-NEXT: or a8, a9, a9 ; CHECK-NEXT: .LBB1_10: # %entry ; CHECK-NEXT: l32i a2, a7, 0 ; CHECK-NEXT: bge a12, a10, .LBB1_12 ; CHECK-NEXT: # %bb.11: ; CHECK-NEXT: addi a10, a11, 40 ; CHECK-NEXT: .LBB1_12: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a8, a10, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a3, a8, 0 ; CHECK-NEXT: l32r a8, .LCPI1_1 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a12, a1, 4 # 4-byte Folded Reload ; CHECK-NEXT: l32i a0, a1, 8 # 4-byte Folded Reload ; CHECK-NEXT: addi a8, a1, 48 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: ret entry: %list = alloca ptr, align 4 call void @llvm.va_start(ptr %list) %0 = va_arg ptr %list, i32 call void @f_i32(i32 %0) %1 = va_arg ptr %list, i64 call void @f_i64(i64 %1) call void @llvm.va_end(ptr %list) ret void } define void @vararg_fixed_1(i32 %a1, ...) nounwind { ; CHECK-LABEL: vararg_fixed_1: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: addi a8, a1, -32 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: s32i a0, a1, 8 # 4-byte Folded Spill ; CHECK-NEXT: s32i a12, a1, 4 # 4-byte Folded Spill ; CHECK-NEXT: s32i a7, a1, 28 ; CHECK-NEXT: s32i a6, a1, 24 ; CHECK-NEXT: s32i a5, a1, 20 ; CHECK-NEXT: s32i a4, a1, 16 ; CHECK-NEXT: s32i a3, a1, 12 ; CHECK-NEXT: addi a10, a1, 12 ; CHECK-NEXT: s32i a10, a1, 4 ; CHECK-NEXT: addi a8, a1, 32 ; CHECK-NEXT: addi a8, a8, -32 ; CHECK-NEXT: s32i a8, a1, 0 ; CHECK-NEXT: movi a9, 8 ; CHECK-NEXT: movi a12, 24 ; CHECK-NEXT: blt a12, a9, .LBB2_2 ; CHECK-NEXT: # %bb.1: # %entry ; CHECK-NEXT: or a8, a10, a10 ; CHECK-NEXT: .LBB2_2: # %entry ; CHECK-NEXT: bge a12, a9, .LBB2_4 ; CHECK-NEXT: # %bb.3: ; CHECK-NEXT: movi a9, 44 ; CHECK-NEXT: .LBB2_4: # %entry ; CHECK-NEXT: s32i a9, a1, 8 ; CHECK-NEXT: add a8, a9, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a8, a8, 0 ; CHECK-NEXT: add a2, a8, a2 ; CHECK-NEXT: l32r a8, .LCPI2_0 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a7, a1, 8 ; CHECK-NEXT: addi a10, a7, 4 ; CHECK-NEXT: l32i a9, a1, 4 ; CHECK-NEXT: l32i a8, a1, 0 ; CHECK-NEXT: or a11, a8, a8 ; CHECK-NEXT: blt a12, a10, .LBB2_6 ; CHECK-NEXT: # %bb.5: # %entry ; CHECK-NEXT: or a11, a9, a9 ; CHECK-NEXT: .LBB2_6: # %entry ; CHECK-NEXT: bge a12, a10, .LBB2_8 ; CHECK-NEXT: # %bb.7: ; CHECK-NEXT: addi a10, a7, 40 ; CHECK-NEXT: .LBB2_8: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a10, a10, a11 ; CHECK-NEXT: addi a7, a10, -4 ; CHECK-NEXT: l32i a11, a1, 8 ; CHECK-NEXT: addi a10, a11, 4 ; CHECK-NEXT: blt a12, a10, .LBB2_10 ; CHECK-NEXT: # %bb.9: # %entry ; CHECK-NEXT: or a8, a9, a9 ; CHECK-NEXT: .LBB2_10: # %entry ; CHECK-NEXT: l32i a2, a7, 0 ; CHECK-NEXT: bge a12, a10, .LBB2_12 ; CHECK-NEXT: # %bb.11: ; CHECK-NEXT: addi a10, a11, 40 ; CHECK-NEXT: .LBB2_12: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a8, a10, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a3, a8, 0 ; CHECK-NEXT: l32r a8, .LCPI2_1 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a12, a1, 4 # 4-byte Folded Reload ; CHECK-NEXT: l32i a0, a1, 8 # 4-byte Folded Reload ; CHECK-NEXT: addi a8, a1, 32 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: ret entry: %list = alloca ptr, align 4 call void @llvm.va_start(ptr %list) %va32 = va_arg ptr %list, i32 %sum = add nsw i32 %va32, %a1 call void @f_i32(i32 %sum) %va64 = va_arg ptr %list, i64 call void @f_i64(i64 %va64) call void @llvm.va_end(ptr %list) ret void } define void @vararg_fixed_4(i32 %a1, i32 %a2, i32 %a3, i32 %a4, ...) nounwind { ; CHECK-LABEL: vararg_fixed_4: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: addi a8, a1, -32 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: s32i a0, a1, 8 # 4-byte Folded Spill ; CHECK-NEXT: s32i a12, a1, 4 # 4-byte Folded Spill ; CHECK-NEXT: s32i a7, a1, 16 ; CHECK-NEXT: s32i a6, a1, 12 ; CHECK-NEXT: addi a10, a1, 12 ; CHECK-NEXT: s32i a10, a1, 4 ; CHECK-NEXT: addi a8, a1, 32 ; CHECK-NEXT: addi a8, a8, -32 ; CHECK-NEXT: s32i a8, a1, 0 ; CHECK-NEXT: movi a9, 20 ; CHECK-NEXT: movi a12, 24 ; CHECK-NEXT: blt a12, a9, .LBB3_2 ; CHECK-NEXT: # %bb.1: # %entry ; CHECK-NEXT: or a8, a10, a10 ; CHECK-NEXT: .LBB3_2: # %entry ; CHECK-NEXT: bge a12, a9, .LBB3_4 ; CHECK-NEXT: # %bb.3: ; CHECK-NEXT: movi a9, 56 ; CHECK-NEXT: .LBB3_4: # %entry ; CHECK-NEXT: s32i a9, a1, 8 ; CHECK-NEXT: add a8, a9, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a8, a8, 0 ; CHECK-NEXT: add a2, a8, a2 ; CHECK-NEXT: l32r a8, .LCPI3_0 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a7, a1, 8 ; CHECK-NEXT: addi a10, a7, 4 ; CHECK-NEXT: l32i a9, a1, 4 ; CHECK-NEXT: l32i a8, a1, 0 ; CHECK-NEXT: or a11, a8, a8 ; CHECK-NEXT: blt a12, a10, .LBB3_6 ; CHECK-NEXT: # %bb.5: # %entry ; CHECK-NEXT: or a11, a9, a9 ; CHECK-NEXT: .LBB3_6: # %entry ; CHECK-NEXT: bge a12, a10, .LBB3_8 ; CHECK-NEXT: # %bb.7: ; CHECK-NEXT: addi a10, a7, 40 ; CHECK-NEXT: .LBB3_8: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a10, a10, a11 ; CHECK-NEXT: addi a7, a10, -4 ; CHECK-NEXT: l32i a11, a1, 8 ; CHECK-NEXT: addi a10, a11, 4 ; CHECK-NEXT: blt a12, a10, .LBB3_10 ; CHECK-NEXT: # %bb.9: # %entry ; CHECK-NEXT: or a8, a9, a9 ; CHECK-NEXT: .LBB3_10: # %entry ; CHECK-NEXT: l32i a2, a7, 0 ; CHECK-NEXT: bge a12, a10, .LBB3_12 ; CHECK-NEXT: # %bb.11: ; CHECK-NEXT: addi a10, a11, 40 ; CHECK-NEXT: .LBB3_12: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a8, a10, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a3, a8, 0 ; CHECK-NEXT: l32r a8, .LCPI3_1 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a12, a1, 4 # 4-byte Folded Reload ; CHECK-NEXT: l32i a0, a1, 8 # 4-byte Folded Reload ; CHECK-NEXT: addi a8, a1, 32 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: ret entry: %list = alloca ptr, align 4 call void @llvm.va_start(ptr %list) %va32 = va_arg ptr %list, i32 %sum = add nsw i32 %va32, %a1 call void @f_i32(i32 %sum) %va64 = va_arg ptr %list, i64 call void @f_i64(i64 %va64) call void @llvm.va_end(ptr %list) ret void } define void @vararg_fixed_5(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, ...) nounwind { ; CHECK-LABEL: vararg_fixed_5: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: addi a8, a1, -16 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: s32i a0, a1, 8 # 4-byte Folded Spill ; CHECK-NEXT: s32i a12, a1, 4 # 4-byte Folded Spill ; CHECK-NEXT: s32i a7, a1, 12 ; CHECK-NEXT: addi a9, a1, 12 ; CHECK-NEXT: s32i a9, a1, 4 ; CHECK-NEXT: addi a8, a1, 16 ; CHECK-NEXT: addi a8, a8, -32 ; CHECK-NEXT: s32i a8, a1, 0 ; CHECK-NEXT: movi a12, 24 ; CHECK-NEXT: blt a12, a12, .LBB4_2 ; CHECK-NEXT: # %bb.1: # %entry ; CHECK-NEXT: or a8, a9, a9 ; CHECK-NEXT: .LBB4_2: # %entry ; CHECK-NEXT: blt a12, a12, .LBB4_4 ; CHECK-NEXT: # %bb.3: # %entry ; CHECK-NEXT: or a9, a12, a12 ; CHECK-NEXT: j .LBB4_5 ; CHECK-NEXT: .LBB4_4: ; CHECK-NEXT: movi a9, 60 ; CHECK-NEXT: .LBB4_5: # %entry ; CHECK-NEXT: s32i a9, a1, 8 ; CHECK-NEXT: add a8, a9, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a8, a8, 0 ; CHECK-NEXT: add a2, a8, a2 ; CHECK-NEXT: l32r a8, .LCPI4_0 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a7, a1, 8 ; CHECK-NEXT: addi a10, a7, 4 ; CHECK-NEXT: l32i a9, a1, 4 ; CHECK-NEXT: l32i a8, a1, 0 ; CHECK-NEXT: or a11, a8, a8 ; CHECK-NEXT: blt a12, a10, .LBB4_7 ; CHECK-NEXT: # %bb.6: # %entry ; CHECK-NEXT: or a11, a9, a9 ; CHECK-NEXT: .LBB4_7: # %entry ; CHECK-NEXT: bge a12, a10, .LBB4_9 ; CHECK-NEXT: # %bb.8: ; CHECK-NEXT: addi a10, a7, 40 ; CHECK-NEXT: .LBB4_9: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a10, a10, a11 ; CHECK-NEXT: addi a7, a10, -4 ; CHECK-NEXT: l32i a11, a1, 8 ; CHECK-NEXT: addi a10, a11, 4 ; CHECK-NEXT: blt a12, a10, .LBB4_11 ; CHECK-NEXT: # %bb.10: # %entry ; CHECK-NEXT: or a8, a9, a9 ; CHECK-NEXT: .LBB4_11: # %entry ; CHECK-NEXT: l32i a2, a7, 0 ; CHECK-NEXT: bge a12, a10, .LBB4_13 ; CHECK-NEXT: # %bb.12: ; CHECK-NEXT: addi a10, a11, 40 ; CHECK-NEXT: .LBB4_13: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a8, a10, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a3, a8, 0 ; CHECK-NEXT: l32r a8, .LCPI4_1 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a12, a1, 4 # 4-byte Folded Reload ; CHECK-NEXT: l32i a0, a1, 8 # 4-byte Folded Reload ; CHECK-NEXT: addi a8, a1, 16 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: ret entry: %list = alloca ptr, align 4 call void @llvm.va_start(ptr %list) %va32 = va_arg ptr %list, i32 %sum = add nsw i32 %va32, %a1 call void @f_i32(i32 %sum) %va64 = va_arg ptr %list, i64 call void @f_i64(i64 %va64) call void @llvm.va_end(ptr %list) ret void } define void @vararg_fixed_6(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, ...) nounwind { ; CHECK-LABEL: vararg_fixed_6: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: addi a8, a1, -16 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: s32i a0, a1, 8 # 4-byte Folded Spill ; CHECK-NEXT: s32i a12, a1, 4 # 4-byte Folded Spill ; CHECK-NEXT: addi a10, a1, 0 ; CHECK-NEXT: s32i a10, a1, 4 ; CHECK-NEXT: addi a8, a1, 16 ; CHECK-NEXT: addi a8, a8, -32 ; CHECK-NEXT: s32i a8, a1, 0 ; CHECK-NEXT: movi a9, 36 ; CHECK-NEXT: movi a12, 24 ; CHECK-NEXT: blt a12, a9, .LBB5_2 ; CHECK-NEXT: # %bb.1: # %entry ; CHECK-NEXT: or a8, a10, a10 ; CHECK-NEXT: .LBB5_2: # %entry ; CHECK-NEXT: bge a12, a9, .LBB5_4 ; CHECK-NEXT: # %bb.3: ; CHECK-NEXT: movi a9, 72 ; CHECK-NEXT: .LBB5_4: # %entry ; CHECK-NEXT: s32i a9, a1, 8 ; CHECK-NEXT: add a8, a9, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a8, a8, 0 ; CHECK-NEXT: add a2, a8, a2 ; CHECK-NEXT: l32r a8, .LCPI5_0 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a7, a1, 8 ; CHECK-NEXT: addi a10, a7, 4 ; CHECK-NEXT: l32i a9, a1, 4 ; CHECK-NEXT: l32i a8, a1, 0 ; CHECK-NEXT: or a11, a8, a8 ; CHECK-NEXT: blt a12, a10, .LBB5_6 ; CHECK-NEXT: # %bb.5: # %entry ; CHECK-NEXT: or a11, a9, a9 ; CHECK-NEXT: .LBB5_6: # %entry ; CHECK-NEXT: bge a12, a10, .LBB5_8 ; CHECK-NEXT: # %bb.7: ; CHECK-NEXT: addi a10, a7, 40 ; CHECK-NEXT: .LBB5_8: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a10, a10, a11 ; CHECK-NEXT: addi a7, a10, -4 ; CHECK-NEXT: l32i a11, a1, 8 ; CHECK-NEXT: addi a10, a11, 4 ; CHECK-NEXT: blt a12, a10, .LBB5_10 ; CHECK-NEXT: # %bb.9: # %entry ; CHECK-NEXT: or a8, a9, a9 ; CHECK-NEXT: .LBB5_10: # %entry ; CHECK-NEXT: l32i a2, a7, 0 ; CHECK-NEXT: bge a12, a10, .LBB5_12 ; CHECK-NEXT: # %bb.11: ; CHECK-NEXT: addi a10, a11, 40 ; CHECK-NEXT: .LBB5_12: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a8, a10, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a3, a8, 0 ; CHECK-NEXT: l32r a8, .LCPI5_1 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a12, a1, 4 # 4-byte Folded Reload ; CHECK-NEXT: l32i a0, a1, 8 # 4-byte Folded Reload ; CHECK-NEXT: addi a8, a1, 16 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: ret entry: %list = alloca ptr, align 4 call void @llvm.va_start(ptr %list) %va32 = va_arg ptr %list, i32 %sum = add nsw i32 %va32, %a1 call void @f_i32(i32 %sum) %va64 = va_arg ptr %list, i64 call void @f_i64(i64 %va64) call void @llvm.va_end(ptr %list) ret void } define void @vararg_fixed_7(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, ...) nounwind { ; CHECK-LABEL: vararg_fixed_7: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: addi a8, a1, -16 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: s32i a0, a1, 8 # 4-byte Folded Spill ; CHECK-NEXT: s32i a12, a1, 4 # 4-byte Folded Spill ; CHECK-NEXT: addi a10, a1, 0 ; CHECK-NEXT: s32i a10, a1, 4 ; CHECK-NEXT: addi a8, a1, 20 ; CHECK-NEXT: addi a8, a8, -32 ; CHECK-NEXT: s32i a8, a1, 0 ; CHECK-NEXT: movi a9, 36 ; CHECK-NEXT: movi a12, 24 ; CHECK-NEXT: blt a12, a9, .LBB6_2 ; CHECK-NEXT: # %bb.1: # %entry ; CHECK-NEXT: or a8, a10, a10 ; CHECK-NEXT: .LBB6_2: # %entry ; CHECK-NEXT: bge a12, a9, .LBB6_4 ; CHECK-NEXT: # %bb.3: ; CHECK-NEXT: movi a9, 72 ; CHECK-NEXT: .LBB6_4: # %entry ; CHECK-NEXT: s32i a9, a1, 8 ; CHECK-NEXT: add a8, a9, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a8, a8, 0 ; CHECK-NEXT: add a2, a8, a2 ; CHECK-NEXT: l32r a8, .LCPI6_0 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a7, a1, 8 ; CHECK-NEXT: addi a10, a7, 4 ; CHECK-NEXT: l32i a9, a1, 4 ; CHECK-NEXT: l32i a8, a1, 0 ; CHECK-NEXT: or a11, a8, a8 ; CHECK-NEXT: blt a12, a10, .LBB6_6 ; CHECK-NEXT: # %bb.5: # %entry ; CHECK-NEXT: or a11, a9, a9 ; CHECK-NEXT: .LBB6_6: # %entry ; CHECK-NEXT: bge a12, a10, .LBB6_8 ; CHECK-NEXT: # %bb.7: ; CHECK-NEXT: addi a10, a7, 40 ; CHECK-NEXT: .LBB6_8: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a10, a10, a11 ; CHECK-NEXT: addi a7, a10, -4 ; CHECK-NEXT: l32i a11, a1, 8 ; CHECK-NEXT: addi a10, a11, 4 ; CHECK-NEXT: blt a12, a10, .LBB6_10 ; CHECK-NEXT: # %bb.9: # %entry ; CHECK-NEXT: or a8, a9, a9 ; CHECK-NEXT: .LBB6_10: # %entry ; CHECK-NEXT: l32i a2, a7, 0 ; CHECK-NEXT: bge a12, a10, .LBB6_12 ; CHECK-NEXT: # %bb.11: ; CHECK-NEXT: addi a10, a11, 40 ; CHECK-NEXT: .LBB6_12: # %entry ; CHECK-NEXT: s32i a10, a1, 8 ; CHECK-NEXT: add a8, a10, a8 ; CHECK-NEXT: addi a8, a8, -4 ; CHECK-NEXT: l32i a3, a8, 0 ; CHECK-NEXT: l32r a8, .LCPI6_1 ; CHECK-NEXT: callx0 a8 ; CHECK-NEXT: l32i a12, a1, 4 # 4-byte Folded Reload ; CHECK-NEXT: l32i a0, a1, 8 # 4-byte Folded Reload ; CHECK-NEXT: addi a8, a1, 16 ; CHECK-NEXT: or a1, a8, a8 ; CHECK-NEXT: ret entry: %list = alloca ptr, align 4 call void @llvm.va_start(ptr %list) %va32 = va_arg ptr %list, i32 %sum = add nsw i32 %va32, %a1 call void @f_i32(i32 %sum) %va64 = va_arg ptr %list, i64 call void @f_i64(i64 %va64) call void @llvm.va_end(ptr %list) ret void }