; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=loongarch64 -O2 < %s | FileCheck %s -check-prefix=LA64 ; RUN: llc -mtriple=loongarch32 -O2 < %s | FileCheck %s -check-prefix=LA32 ;; Tests copied from PowerPC. ;; Free probe define i8 @f0() #0 { ; ; LA64-LABEL: f0: ; LA64: # %bb.0: # %entry ; LA64-NEXT: addi.d $sp, $sp, -80 ; LA64-NEXT: .cfi_def_cfa_offset 80 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 16 ; LA64-NEXT: ld.b $a0, $sp, 16 ; LA64-NEXT: addi.d $sp, $sp, 80 ; LA64-NEXT: ret ; ; LA32-LABEL: f0: ; LA32: # %bb.0: # %entry ; LA32-NEXT: addi.w $sp, $sp, -64 ; LA32-NEXT: .cfi_def_cfa_offset 64 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 0 ; LA32-NEXT: ld.b $a0, $sp, 0 ; LA32-NEXT: addi.w $sp, $sp, 64 ; LA32-NEXT: ret entry: %a = alloca i8, i64 64 %b = getelementptr inbounds i8, ptr %a, i64 63 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } define i8 @f1() #0 { ; ; LA64-LABEL: f1: ; LA64: # %bb.0: # %entry ; LA64-NEXT: lu12i.w $a0, 1 ; LA64-NEXT: sub.d $sp, $sp, $a0 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: .cfi_def_cfa_offset 4096 ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: .cfi_def_cfa_offset 4112 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 16 ; LA64-NEXT: ld.b $a0, $sp, 16 ; LA64-NEXT: lu12i.w $a1, 1 ; LA64-NEXT: ori $a1, $a1, 16 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ret ; ; LA32-LABEL: f1: ; LA32: # %bb.0: # %entry ; LA32-NEXT: lu12i.w $a0, 1 ; LA32-NEXT: sub.w $sp, $sp, $a0 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: .cfi_def_cfa_offset 4096 ; LA32-NEXT: addi.w $sp, $sp, -16 ; LA32-NEXT: .cfi_def_cfa_offset 4112 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 16 ; LA32-NEXT: ld.b $a0, $sp, 16 ; LA32-NEXT: lu12i.w $a1, 1 ; LA32-NEXT: ori $a1, $a1, 16 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ret entry: %a = alloca i8, i64 4096 %b = getelementptr inbounds i8, ptr %a, i64 63 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } define i8 @f2() #0 { ; ; LA64-LABEL: f2: ; LA64: # %bb.0: # %entry ; LA64-NEXT: lu12i.w $a0, 16 ; LA64-NEXT: sub.d $t1, $sp, $a0 ; LA64-NEXT: .cfi_def_cfa 13, 65536 ; LA64-NEXT: lu12i.w $t2, 1 ; LA64-NEXT: .LBB2_1: # %entry ; LA64-NEXT: # =>This Inner Loop Header: Depth=1 ; LA64-NEXT: sub.d $sp, $sp, $t2 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: bne $sp, $t1, .LBB2_1 ; LA64-NEXT: # %bb.2: # %entry ; LA64-NEXT: .cfi_def_cfa_register 3 ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: .cfi_def_cfa_offset 65552 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 16 ; LA64-NEXT: ld.b $a0, $sp, 16 ; LA64-NEXT: lu12i.w $a1, 16 ; LA64-NEXT: ori $a1, $a1, 16 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ret ; ; LA32-LABEL: f2: ; LA32: # %bb.0: # %entry ; LA32-NEXT: lu12i.w $a0, 16 ; LA32-NEXT: sub.w $t1, $sp, $a0 ; LA32-NEXT: .cfi_def_cfa 13, 65536 ; LA32-NEXT: lu12i.w $t2, 1 ; LA32-NEXT: .LBB2_1: # %entry ; LA32-NEXT: # =>This Inner Loop Header: Depth=1 ; LA32-NEXT: sub.w $sp, $sp, $t2 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: bne $sp, $t1, .LBB2_1 ; LA32-NEXT: # %bb.2: # %entry ; LA32-NEXT: .cfi_def_cfa_register 3 ; LA32-NEXT: addi.w $sp, $sp, -16 ; LA32-NEXT: .cfi_def_cfa_offset 65552 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 16 ; LA32-NEXT: ld.b $a0, $sp, 16 ; LA32-NEXT: lu12i.w $a1, 16 ; LA32-NEXT: ori $a1, $a1, 16 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ret entry: %a = alloca i8, i64 65536 %b = getelementptr inbounds i8, ptr %a, i64 63 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } define i8 @f3() #0 "stack-probe-size"="32768" { ; ; LA64-LABEL: f3: ; LA64: # %bb.0: # %entry ; LA64-NEXT: lu12i.w $a0, 8 ; LA64-NEXT: sub.d $sp, $sp, $a0 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: .cfi_def_cfa_offset 32768 ; LA64-NEXT: lu12i.w $a0, 8 ; LA64-NEXT: sub.d $sp, $sp, $a0 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: .cfi_def_cfa_offset 65536 ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: .cfi_def_cfa_offset 65552 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 16 ; LA64-NEXT: ld.b $a0, $sp, 16 ; LA64-NEXT: lu12i.w $a1, 16 ; LA64-NEXT: ori $a1, $a1, 16 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ret ; ; LA32-LABEL: f3: ; LA32: # %bb.0: # %entry ; LA32-NEXT: lu12i.w $a0, 8 ; LA32-NEXT: sub.w $sp, $sp, $a0 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: .cfi_def_cfa_offset 32768 ; LA32-NEXT: lu12i.w $a0, 8 ; LA32-NEXT: sub.w $sp, $sp, $a0 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: .cfi_def_cfa_offset 65536 ; LA32-NEXT: addi.w $sp, $sp, -16 ; LA32-NEXT: .cfi_def_cfa_offset 65552 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 16 ; LA32-NEXT: ld.b $a0, $sp, 16 ; LA32-NEXT: lu12i.w $a1, 16 ; LA32-NEXT: ori $a1, $a1, 16 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ret entry: %a = alloca i8, i64 65536 %b = getelementptr inbounds i8, ptr %a, i64 63 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } ; Same as f2, but without protection. define i8 @f4() { ; ; LA64-LABEL: f4: ; LA64: # %bb.0: # %entry ; LA64-NEXT: lu12i.w $a0, 16 ; LA64-NEXT: ori $a0, $a0, 16 ; LA64-NEXT: sub.d $sp, $sp, $a0 ; LA64-NEXT: .cfi_def_cfa_offset 65552 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 16 ; LA64-NEXT: ld.b $a0, $sp, 16 ; LA64-NEXT: lu12i.w $a1, 16 ; LA64-NEXT: ori $a1, $a1, 16 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ret ; ; LA32-LABEL: f4: ; LA32: # %bb.0: # %entry ; LA32-NEXT: lu12i.w $a0, 16 ; LA32-NEXT: ori $a0, $a0, 16 ; LA32-NEXT: sub.w $sp, $sp, $a0 ; LA32-NEXT: .cfi_def_cfa_offset 65552 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 16 ; LA32-NEXT: ld.b $a0, $sp, 16 ; LA32-NEXT: lu12i.w $a1, 16 ; LA32-NEXT: ori $a1, $a1, 16 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ret entry: %a = alloca i8, i64 65536 %b = getelementptr inbounds i8, ptr %a, i64 63 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } define i8 @f5() #0 "stack-probe-size"="65536" { ; ; LA64-LABEL: f5: ; LA64: # %bb.0: # %entry ; LA64-NEXT: lu12i.w $a0, 256 ; LA64-NEXT: sub.d $t1, $sp, $a0 ; LA64-NEXT: .cfi_def_cfa 13, 1048576 ; LA64-NEXT: lu12i.w $t2, 16 ; LA64-NEXT: .LBB5_1: # %entry ; LA64-NEXT: # =>This Inner Loop Header: Depth=1 ; LA64-NEXT: sub.d $sp, $sp, $t2 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: bne $sp, $t1, .LBB5_1 ; LA64-NEXT: # %bb.2: # %entry ; LA64-NEXT: .cfi_def_cfa_register 3 ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: .cfi_def_cfa_offset 1048592 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 16 ; LA64-NEXT: ld.b $a0, $sp, 16 ; LA64-NEXT: lu12i.w $a1, 256 ; LA64-NEXT: ori $a1, $a1, 16 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ret ; ; LA32-LABEL: f5: ; LA32: # %bb.0: # %entry ; LA32-NEXT: lu12i.w $a0, 256 ; LA32-NEXT: sub.w $t1, $sp, $a0 ; LA32-NEXT: .cfi_def_cfa 13, 1048576 ; LA32-NEXT: lu12i.w $t2, 16 ; LA32-NEXT: .LBB5_1: # %entry ; LA32-NEXT: # =>This Inner Loop Header: Depth=1 ; LA32-NEXT: sub.w $sp, $sp, $t2 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: bne $sp, $t1, .LBB5_1 ; LA32-NEXT: # %bb.2: # %entry ; LA32-NEXT: .cfi_def_cfa_register 3 ; LA32-NEXT: addi.w $sp, $sp, -16 ; LA32-NEXT: .cfi_def_cfa_offset 1048592 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 16 ; LA32-NEXT: ld.b $a0, $sp, 16 ; LA32-NEXT: lu12i.w $a1, 256 ; LA32-NEXT: ori $a1, $a1, 16 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ret entry: %a = alloca i8, i64 1048576 %b = getelementptr inbounds i8, ptr %a, i64 63 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } define i8 @f6() #0 { ; ; LA64-LABEL: f6: ; LA64: # %bb.0: # %entry ; LA64-NEXT: lu12i.w $a0, 262144 ; LA64-NEXT: sub.d $t1, $sp, $a0 ; LA64-NEXT: .cfi_def_cfa 13, 1073741824 ; LA64-NEXT: lu12i.w $t2, 1 ; LA64-NEXT: .LBB6_1: # %entry ; LA64-NEXT: # =>This Inner Loop Header: Depth=1 ; LA64-NEXT: sub.d $sp, $sp, $t2 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: bne $sp, $t1, .LBB6_1 ; LA64-NEXT: # %bb.2: # %entry ; LA64-NEXT: .cfi_def_cfa_register 3 ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: .cfi_def_cfa_offset 1073741840 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 16 ; LA64-NEXT: ld.b $a0, $sp, 16 ; LA64-NEXT: lu12i.w $a1, 262144 ; LA64-NEXT: ori $a1, $a1, 16 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ret ; ; LA32-LABEL: f6: ; LA32: # %bb.0: # %entry ; LA32-NEXT: lu12i.w $a0, 262144 ; LA32-NEXT: sub.w $t1, $sp, $a0 ; LA32-NEXT: .cfi_def_cfa 13, 1073741824 ; LA32-NEXT: lu12i.w $t2, 1 ; LA32-NEXT: .LBB6_1: # %entry ; LA32-NEXT: # =>This Inner Loop Header: Depth=1 ; LA32-NEXT: sub.w $sp, $sp, $t2 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: bne $sp, $t1, .LBB6_1 ; LA32-NEXT: # %bb.2: # %entry ; LA32-NEXT: .cfi_def_cfa_register 3 ; LA32-NEXT: addi.w $sp, $sp, -16 ; LA32-NEXT: .cfi_def_cfa_offset 1073741840 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 16 ; LA32-NEXT: ld.b $a0, $sp, 16 ; LA32-NEXT: lu12i.w $a1, 262144 ; LA32-NEXT: ori $a1, $a1, 16 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ret entry: %a = alloca i8, i64 1073741824 %b = getelementptr inbounds i8, ptr %a, i64 63 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } define i8 @f7() #0 "stack-probe-size"="65536" { ; ; LA64-LABEL: f7: ; LA64: # %bb.0: # %entry ; LA64-NEXT: lu12i.w $a0, 244128 ; LA64-NEXT: sub.d $t1, $sp, $a0 ; LA64-NEXT: .cfi_def_cfa 13, 999948288 ; LA64-NEXT: lu12i.w $t2, 16 ; LA64-NEXT: .LBB7_1: # %entry ; LA64-NEXT: # =>This Inner Loop Header: Depth=1 ; LA64-NEXT: sub.d $sp, $sp, $t2 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: bne $sp, $t1, .LBB7_1 ; LA64-NEXT: # %bb.2: # %entry ; LA64-NEXT: .cfi_def_cfa_register 3 ; LA64-NEXT: lu12i.w $a0, 12 ; LA64-NEXT: ori $a0, $a0, 2576 ; LA64-NEXT: sub.d $sp, $sp, $a0 ; LA64-NEXT: .cfi_def_cfa_offset 1000000016 ; LA64-NEXT: ori $a0, $zero, 3 ; LA64-NEXT: st.b $a0, $sp, 9 ; LA64-NEXT: ld.b $a0, $sp, 9 ; LA64-NEXT: lu12i.w $a1, 244140 ; LA64-NEXT: ori $a1, $a1, 2576 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ret ; ; LA32-LABEL: f7: ; LA32: # %bb.0: # %entry ; LA32-NEXT: lu12i.w $a0, 244128 ; LA32-NEXT: sub.w $t1, $sp, $a0 ; LA32-NEXT: .cfi_def_cfa 13, 999948288 ; LA32-NEXT: lu12i.w $t2, 16 ; LA32-NEXT: .LBB7_1: # %entry ; LA32-NEXT: # =>This Inner Loop Header: Depth=1 ; LA32-NEXT: sub.w $sp, $sp, $t2 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: bne $sp, $t1, .LBB7_1 ; LA32-NEXT: # %bb.2: # %entry ; LA32-NEXT: .cfi_def_cfa_register 3 ; LA32-NEXT: lu12i.w $a0, 12 ; LA32-NEXT: ori $a0, $a0, 2576 ; LA32-NEXT: sub.w $sp, $sp, $a0 ; LA32-NEXT: .cfi_def_cfa_offset 1000000016 ; LA32-NEXT: ori $a0, $zero, 3 ; LA32-NEXT: st.b $a0, $sp, 9 ; LA32-NEXT: ld.b $a0, $sp, 9 ; LA32-NEXT: lu12i.w $a1, 244140 ; LA32-NEXT: ori $a1, $a1, 2576 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ret entry: %a = alloca i8, i64 1000000007 %b = getelementptr inbounds i8, ptr %a, i64 101 store volatile i8 3, ptr %a %c = load volatile i8, ptr %a ret i8 %c } ; alloca + align < probe_size define i32 @f8(i64 %i) local_unnamed_addr #0 { ; ; LA64-LABEL: f8: ; LA64: # %bb.0: ; LA64-NEXT: addi.d $sp, $sp, -896 ; LA64-NEXT: .cfi_def_cfa_offset 896 ; LA64-NEXT: st.d $ra, $sp, 888 # 8-byte Folded Spill ; LA64-NEXT: st.d $fp, $sp, 880 # 8-byte Folded Spill ; LA64-NEXT: .cfi_offset 1, -8 ; LA64-NEXT: .cfi_offset 22, -16 ; LA64-NEXT: addi.d $fp, $sp, 896 ; LA64-NEXT: .cfi_def_cfa 22, 0 ; LA64-NEXT: bstrins.d $sp, $zero, 5, 0 ; LA64-NEXT: slli.d $a0, $a0, 2 ; LA64-NEXT: addi.d $a1, $sp, 64 ; LA64-NEXT: ori $a2, $zero, 1 ; LA64-NEXT: stx.w $a2, $a0, $a1 ; LA64-NEXT: ld.w $a0, $sp, 64 ; LA64-NEXT: addi.d $sp, $fp, -896 ; LA64-NEXT: ld.d $fp, $sp, 880 # 8-byte Folded Reload ; LA64-NEXT: ld.d $ra, $sp, 888 # 8-byte Folded Reload ; LA64-NEXT: addi.d $sp, $sp, 896 ; LA64-NEXT: ret ; ; LA32-LABEL: f8: ; LA32: # %bb.0: ; LA32-NEXT: addi.w $sp, $sp, -832 ; LA32-NEXT: .cfi_def_cfa_offset 832 ; LA32-NEXT: st.w $ra, $sp, 828 # 4-byte Folded Spill ; LA32-NEXT: st.w $fp, $sp, 824 # 4-byte Folded Spill ; LA32-NEXT: .cfi_offset 1, -4 ; LA32-NEXT: .cfi_offset 22, -8 ; LA32-NEXT: addi.w $fp, $sp, 832 ; LA32-NEXT: .cfi_def_cfa 22, 0 ; LA32-NEXT: bstrins.w $sp, $zero, 5, 0 ; LA32-NEXT: slli.w $a0, $a0, 2 ; LA32-NEXT: addi.w $a1, $sp, 0 ; LA32-NEXT: add.w $a0, $a1, $a0 ; LA32-NEXT: ori $a1, $zero, 1 ; LA32-NEXT: st.w $a1, $a0, 0 ; LA32-NEXT: ld.w $a0, $sp, 0 ; LA32-NEXT: addi.w $sp, $fp, -832 ; LA32-NEXT: ld.w $fp, $sp, 824 # 4-byte Folded Reload ; LA32-NEXT: ld.w $ra, $sp, 828 # 4-byte Folded Reload ; LA32-NEXT: addi.w $sp, $sp, 832 ; LA32-NEXT: ret %a = alloca i32, i32 200, align 64 %b = getelementptr inbounds i32, ptr %a, i64 %i store volatile i32 1, ptr %b %c = load volatile i32, ptr %a ret i32 %c } ; alloca > probe_size, align > probe_size define i32 @f9(i64 %i) local_unnamed_addr #0 { ; ; LA64-LABEL: f9: ; LA64: # %bb.0: ; LA64-NEXT: addi.d $sp, $sp, -2032 ; LA64-NEXT: .cfi_def_cfa_offset 2032 ; LA64-NEXT: st.d $ra, $sp, 2024 # 8-byte Folded Spill ; LA64-NEXT: st.d $fp, $sp, 2016 # 8-byte Folded Spill ; LA64-NEXT: .cfi_offset 1, -8 ; LA64-NEXT: .cfi_offset 22, -16 ; LA64-NEXT: addi.d $fp, $sp, 2032 ; LA64-NEXT: .cfi_def_cfa 22, 0 ; LA64-NEXT: lu12i.w $a1, 1 ; LA64-NEXT: sub.d $sp, $sp, $a1 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: sub.d $sp, $sp, $a1 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: bstrins.d $sp, $zero, 10, 0 ; LA64-NEXT: slli.d $a0, $a0, 2 ; LA64-NEXT: ori $a1, $zero, 2048 ; LA64-NEXT: add.d $a1, $sp, $a1 ; LA64-NEXT: ori $a2, $zero, 1 ; LA64-NEXT: stx.w $a2, $a0, $a1 ; LA64-NEXT: ori $a0, $zero, 2048 ; LA64-NEXT: add.d $a0, $sp, $a0 ; LA64-NEXT: ld.w $a0, $a0, 0 ; LA64-NEXT: lu12i.w $a1, 2 ; LA64-NEXT: ori $a1, $a1, 2048 ; LA64-NEXT: sub.d $sp, $fp, $a1 ; LA64-NEXT: lu12i.w $a1, 2 ; LA64-NEXT: ori $a1, $a1, 16 ; LA64-NEXT: add.d $sp, $sp, $a1 ; LA64-NEXT: ld.d $fp, $sp, 2016 # 8-byte Folded Reload ; LA64-NEXT: ld.d $ra, $sp, 2024 # 8-byte Folded Reload ; LA64-NEXT: addi.d $sp, $sp, 2032 ; LA64-NEXT: ret ; ; LA32-LABEL: f9: ; LA32: # %bb.0: ; LA32-NEXT: addi.w $sp, $sp, -2032 ; LA32-NEXT: .cfi_def_cfa_offset 2032 ; LA32-NEXT: st.w $ra, $sp, 2028 # 4-byte Folded Spill ; LA32-NEXT: st.w $fp, $sp, 2024 # 4-byte Folded Spill ; LA32-NEXT: .cfi_offset 1, -4 ; LA32-NEXT: .cfi_offset 22, -8 ; LA32-NEXT: addi.w $fp, $sp, 2032 ; LA32-NEXT: .cfi_def_cfa 22, 0 ; LA32-NEXT: lu12i.w $a1, 1 ; LA32-NEXT: sub.w $sp, $sp, $a1 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: sub.w $sp, $sp, $a1 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: addi.w $sp, $sp, -16 ; LA32-NEXT: bstrins.w $sp, $zero, 10, 0 ; LA32-NEXT: slli.w $a0, $a0, 2 ; LA32-NEXT: ori $a1, $zero, 2048 ; LA32-NEXT: add.w $a1, $sp, $a1 ; LA32-NEXT: add.w $a0, $a1, $a0 ; LA32-NEXT: ori $a1, $zero, 1 ; LA32-NEXT: st.w $a1, $a0, 0 ; LA32-NEXT: ori $a0, $zero, 2048 ; LA32-NEXT: add.w $a0, $sp, $a0 ; LA32-NEXT: ld.w $a0, $a0, 0 ; LA32-NEXT: lu12i.w $a1, 2 ; LA32-NEXT: ori $a1, $a1, 2048 ; LA32-NEXT: sub.w $sp, $fp, $a1 ; LA32-NEXT: lu12i.w $a1, 2 ; LA32-NEXT: ori $a1, $a1, 16 ; LA32-NEXT: add.w $sp, $sp, $a1 ; LA32-NEXT: ld.w $fp, $sp, 2024 # 4-byte Folded Reload ; LA32-NEXT: ld.w $ra, $sp, 2028 # 4-byte Folded Reload ; LA32-NEXT: addi.w $sp, $sp, 2032 ; LA32-NEXT: ret %a = alloca i32, i32 2000, align 2048 %b = getelementptr inbounds i32, ptr %a, i64 %i store volatile i32 1, ptr %b %c = load volatile i32, ptr %a ret i32 %c } ; alloca < probe_size, align < probe_size, alloca + align > probe_size define i32 @f10(i64 %i) local_unnamed_addr #0 { ; ; LA64-LABEL: f10: ; LA64: # %bb.0: ; LA64-NEXT: addi.d $sp, $sp, -2032 ; LA64-NEXT: .cfi_def_cfa_offset 2032 ; LA64-NEXT: st.d $ra, $sp, 2024 # 8-byte Folded Spill ; LA64-NEXT: st.d $fp, $sp, 2016 # 8-byte Folded Spill ; LA64-NEXT: .cfi_offset 1, -8 ; LA64-NEXT: .cfi_offset 22, -16 ; LA64-NEXT: addi.d $fp, $sp, 2032 ; LA64-NEXT: .cfi_def_cfa 22, 0 ; LA64-NEXT: addi.d $sp, $sp, -2048 ; LA64-NEXT: addi.d $sp, $sp, -1040 ; LA64-NEXT: bstrins.d $sp, $zero, 9, 0 ; LA64-NEXT: slli.d $a0, $a0, 2 ; LA64-NEXT: addi.d $a1, $sp, 1024 ; LA64-NEXT: ori $a2, $zero, 1 ; LA64-NEXT: stx.w $a2, $a0, $a1 ; LA64-NEXT: ld.w $a0, $sp, 1024 ; LA64-NEXT: lu12i.w $a1, 1 ; LA64-NEXT: ori $a1, $a1, 1024 ; LA64-NEXT: sub.d $sp, $fp, $a1 ; LA64-NEXT: addi.d $sp, $sp, 2032 ; LA64-NEXT: addi.d $sp, $sp, 1056 ; LA64-NEXT: ld.d $fp, $sp, 2016 # 8-byte Folded Reload ; LA64-NEXT: ld.d $ra, $sp, 2024 # 8-byte Folded Reload ; LA64-NEXT: addi.d $sp, $sp, 2032 ; LA64-NEXT: ret ; ; LA32-LABEL: f10: ; LA32: # %bb.0: ; LA32-NEXT: addi.w $sp, $sp, -2032 ; LA32-NEXT: .cfi_def_cfa_offset 2032 ; LA32-NEXT: st.w $ra, $sp, 2028 # 4-byte Folded Spill ; LA32-NEXT: st.w $fp, $sp, 2024 # 4-byte Folded Spill ; LA32-NEXT: .cfi_offset 1, -4 ; LA32-NEXT: .cfi_offset 22, -8 ; LA32-NEXT: addi.w $fp, $sp, 2032 ; LA32-NEXT: .cfi_def_cfa 22, 0 ; LA32-NEXT: addi.w $sp, $sp, -2048 ; LA32-NEXT: addi.w $sp, $sp, -1040 ; LA32-NEXT: bstrins.w $sp, $zero, 9, 0 ; LA32-NEXT: slli.w $a0, $a0, 2 ; LA32-NEXT: addi.w $a1, $sp, 1024 ; LA32-NEXT: add.w $a0, $a1, $a0 ; LA32-NEXT: ori $a1, $zero, 1 ; LA32-NEXT: st.w $a1, $a0, 0 ; LA32-NEXT: ld.w $a0, $sp, 1024 ; LA32-NEXT: lu12i.w $a1, 1 ; LA32-NEXT: ori $a1, $a1, 1024 ; LA32-NEXT: sub.w $sp, $fp, $a1 ; LA32-NEXT: addi.w $sp, $sp, 2032 ; LA32-NEXT: addi.w $sp, $sp, 1056 ; LA32-NEXT: ld.w $fp, $sp, 2024 # 4-byte Folded Reload ; LA32-NEXT: ld.w $ra, $sp, 2028 # 4-byte Folded Reload ; LA32-NEXT: addi.w $sp, $sp, 2032 ; LA32-NEXT: ret %a = alloca i32, i32 1000, align 1024 %b = getelementptr inbounds i32, ptr %a, i64 %i store volatile i32 1, ptr %b %c = load volatile i32, ptr %a ret i32 %c } define void @f11(i32 %vla_size, i64 %i) #0 { ; ; LA64-LABEL: f11: ; LA64: # %bb.0: ; LA64-NEXT: addi.d $sp, $sp, -2032 ; LA64-NEXT: .cfi_def_cfa_offset 2032 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: st.d $ra, $sp, 2024 # 8-byte Folded Spill ; LA64-NEXT: st.d $fp, $sp, 2016 # 8-byte Folded Spill ; LA64-NEXT: st.d $s8, $sp, 2008 # 8-byte Folded Spill ; LA64-NEXT: .cfi_offset 1, -8 ; LA64-NEXT: .cfi_offset 22, -16 ; LA64-NEXT: .cfi_offset 31, -24 ; LA64-NEXT: addi.d $fp, $sp, 2032 ; LA64-NEXT: .cfi_def_cfa 22, 0 ; LA64-NEXT: lu12i.w $a2, 15 ; LA64-NEXT: sub.d $t1, $sp, $a2 ; LA64-NEXT: lu12i.w $t2, 1 ; LA64-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 ; LA64-NEXT: sub.d $sp, $sp, $t2 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: bne $sp, $t1, .LBB11_1 ; LA64-NEXT: # %bb.2: ; LA64-NEXT: addi.d $sp, $sp, -2048 ; LA64-NEXT: addi.d $sp, $sp, -16 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: bstrins.d $sp, $zero, 14, 0 ; LA64-NEXT: move $s8, $sp ; LA64-NEXT: slli.d $a1, $a1, 2 ; LA64-NEXT: lu12i.w $a2, 8 ; LA64-NEXT: add.d $a2, $s8, $a2 ; LA64-NEXT: ori $a3, $zero, 1 ; LA64-NEXT: stx.w $a3, $a1, $a2 ; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0 ; LA64-NEXT: addi.d $a0, $a0, 15 ; LA64-NEXT: bstrpick.d $a0, $a0, 32, 4 ; LA64-NEXT: slli.d $a0, $a0, 4 ; LA64-NEXT: sub.d $a0, $sp, $a0 ; LA64-NEXT: bstrins.d $a0, $zero, 10, 0 ; LA64-NEXT: lu12i.w $a1, 1 ; LA64-NEXT: .LBB11_3: # =>This Inner Loop Header: Depth=1 ; LA64-NEXT: sub.d $sp, $sp, $a1 ; LA64-NEXT: st.d $zero, $sp, 0 ; LA64-NEXT: bltu $a0, $sp, .LBB11_3 ; LA64-NEXT: # %bb.4: ; LA64-NEXT: move $sp, $a0 ; LA64-NEXT: ld.b $zero, $a0, 0 ; LA64-NEXT: lu12i.w $a0, 16 ; LA64-NEXT: sub.d $sp, $fp, $a0 ; LA64-NEXT: lu12i.w $a0, 15 ; LA64-NEXT: ori $a0, $a0, 2064 ; LA64-NEXT: add.d $sp, $sp, $a0 ; LA64-NEXT: ld.d $s8, $sp, 2008 # 8-byte Folded Reload ; LA64-NEXT: ld.d $fp, $sp, 2016 # 8-byte Folded Reload ; LA64-NEXT: ld.d $ra, $sp, 2024 # 8-byte Folded Reload ; LA64-NEXT: addi.d $sp, $sp, 2032 ; LA64-NEXT: ret ; ; LA32-LABEL: f11: ; LA32: # %bb.0: ; LA32-NEXT: addi.w $sp, $sp, -2032 ; LA32-NEXT: .cfi_def_cfa_offset 2032 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: st.w $ra, $sp, 2028 # 4-byte Folded Spill ; LA32-NEXT: st.w $fp, $sp, 2024 # 4-byte Folded Spill ; LA32-NEXT: st.w $s8, $sp, 2020 # 4-byte Folded Spill ; LA32-NEXT: .cfi_offset 1, -4 ; LA32-NEXT: .cfi_offset 22, -8 ; LA32-NEXT: .cfi_offset 31, -12 ; LA32-NEXT: addi.w $fp, $sp, 2032 ; LA32-NEXT: .cfi_def_cfa 22, 0 ; LA32-NEXT: lu12i.w $a2, 15 ; LA32-NEXT: sub.w $t1, $sp, $a2 ; LA32-NEXT: lu12i.w $t2, 1 ; LA32-NEXT: .LBB11_1: # =>This Inner Loop Header: Depth=1 ; LA32-NEXT: sub.w $sp, $sp, $t2 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: bne $sp, $t1, .LBB11_1 ; LA32-NEXT: # %bb.2: ; LA32-NEXT: addi.w $sp, $sp, -2048 ; LA32-NEXT: addi.w $sp, $sp, -16 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: bstrins.w $sp, $zero, 14, 0 ; LA32-NEXT: move $s8, $sp ; LA32-NEXT: slli.w $a1, $a1, 2 ; LA32-NEXT: lu12i.w $a2, 8 ; LA32-NEXT: add.w $a2, $s8, $a2 ; LA32-NEXT: add.w $a1, $a2, $a1 ; LA32-NEXT: ori $a2, $zero, 1 ; LA32-NEXT: st.w $a2, $a1, 0 ; LA32-NEXT: addi.w $a0, $a0, 15 ; LA32-NEXT: addi.w $a1, $zero, -16 ; LA32-NEXT: and $a0, $a0, $a1 ; LA32-NEXT: sub.w $a0, $sp, $a0 ; LA32-NEXT: addi.w $a1, $zero, -2048 ; LA32-NEXT: and $a0, $a0, $a1 ; LA32-NEXT: lu12i.w $a1, 1 ; LA32-NEXT: .LBB11_3: # =>This Inner Loop Header: Depth=1 ; LA32-NEXT: sub.w $sp, $sp, $a1 ; LA32-NEXT: st.w $zero, $sp, 0 ; LA32-NEXT: bltu $a0, $sp, .LBB11_3 ; LA32-NEXT: # %bb.4: ; LA32-NEXT: move $sp, $a0 ; LA32-NEXT: ld.b $zero, $a0, 0 ; LA32-NEXT: lu12i.w $a0, 16 ; LA32-NEXT: sub.w $sp, $fp, $a0 ; LA32-NEXT: lu12i.w $a0, 15 ; LA32-NEXT: ori $a0, $a0, 2064 ; LA32-NEXT: add.w $sp, $sp, $a0 ; LA32-NEXT: ld.w $s8, $sp, 2020 # 4-byte Folded Reload ; LA32-NEXT: ld.w $fp, $sp, 2024 # 4-byte Folded Reload ; LA32-NEXT: ld.w $ra, $sp, 2028 # 4-byte Folded Reload ; LA32-NEXT: addi.w $sp, $sp, 2032 ; LA32-NEXT: ret %a = alloca i32, i32 4096, align 32768 %b = getelementptr inbounds i32, ptr %a, i64 %i store volatile i32 1, ptr %b %1 = zext i32 %vla_size to i64 %vla = alloca i8, i64 %1, align 2048 %2 = load volatile i8, ptr %vla, align 2048 ret void } attributes #0 = { "probe-stack"="inline-asm" }