; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs \ ; RUN: -mtriple=powerpc64le-linux-gnu < %s | FileCheck \ ; RUN: -check-prefix=CHECK-LE %s ; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs \ ; RUN: -mtriple=powerpc64-linux-gnu < %s | FileCheck \ ; RUN: -check-prefix=CHECK-BE %s ; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs \ ; RUN: -mtriple=powerpc-linux-gnu < %s | FileCheck \ ; RUN: -check-prefix=CHECK-32 %s ; Free probe define i8 @f0() #0 nounwind { ; CHECK-LE-LABEL: f0: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, -64(r1) ; CHECK-LE-NEXT: lbz r3, -64(r1) ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f0: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, -64(r1) ; CHECK-BE-NEXT: lbz r3, -64(r1) ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f0: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: stwu r1, -80(r1) ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: stb r3, 16(r1) ; CHECK-32-NEXT: lbz r3, 16(r1) ; CHECK-32-NEXT: addi r1, r1, 80 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 64 %b = getelementptr inbounds i8, i8* %a, i64 63 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } define i8 @f1() #0 "stack-probe-size"="0" nounwind { ; CHECK-LE-LABEL: f1: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: mr r12, r1 ; CHECK-LE-NEXT: li r0, 259 ; CHECK-LE-NEXT: mtctr r0 ; CHECK-LE-NEXT: .LBB1_1: # %entry ; CHECK-LE-NEXT: # ; CHECK-LE-NEXT: stdu r12, -16(r1) ; CHECK-LE-NEXT: bdnz .LBB1_1 ; CHECK-LE-NEXT: # %bb.2: # %entry ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, 48(r1) ; CHECK-LE-NEXT: lbz r3, 48(r1) ; CHECK-LE-NEXT: addi r1, r1, 4144 ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f1: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: mr r12, r1 ; CHECK-BE-NEXT: li r0, 260 ; CHECK-BE-NEXT: mtctr r0 ; CHECK-BE-NEXT: .LBB1_1: # %entry ; CHECK-BE-NEXT: # ; CHECK-BE-NEXT: stdu r12, -16(r1) ; CHECK-BE-NEXT: bdnz .LBB1_1 ; CHECK-BE-NEXT: # %bb.2: # %entry ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, 64(r1) ; CHECK-BE-NEXT: lbz r3, 64(r1) ; CHECK-BE-NEXT: addi r1, r1, 4160 ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f1: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: mr r12, r1 ; CHECK-32-NEXT: li r0, 257 ; CHECK-32-NEXT: mtctr r0 ; CHECK-32-NEXT: .LBB1_1: # %entry ; CHECK-32-NEXT: # ; CHECK-32-NEXT: stwu r12, -16(r1) ; CHECK-32-NEXT: bdnz .LBB1_1 ; CHECK-32-NEXT: # %bb.2: # %entry ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: sub r0, r1, r12 ; CHECK-32-NEXT: stb r3, 16(r1) ; CHECK-32-NEXT: sub r0, r1, r0 ; CHECK-32-NEXT: lbz r3, 16(r1) ; CHECK-32-NEXT: addi r1, r1, 4112 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 4096 %b = getelementptr inbounds i8, i8* %a, i64 63 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } define i8 @f2() #0 nounwind { ; CHECK-LE-LABEL: f2: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: mr r12, r1 ; CHECK-LE-NEXT: stdu r12, -48(r1) ; CHECK-LE-NEXT: li r0, 16 ; CHECK-LE-NEXT: mtctr r0 ; CHECK-LE-NEXT: .LBB2_1: # %entry ; CHECK-LE-NEXT: # ; CHECK-LE-NEXT: stdu r12, -4096(r1) ; CHECK-LE-NEXT: bdnz .LBB2_1 ; CHECK-LE-NEXT: # %bb.2: # %entry ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, 48(r1) ; CHECK-LE-NEXT: lbz r3, 48(r1) ; CHECK-LE-NEXT: ld r1, 0(r1) ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f2: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: mr r12, r1 ; CHECK-BE-NEXT: stdu r12, -64(r1) ; CHECK-BE-NEXT: li r0, 16 ; CHECK-BE-NEXT: mtctr r0 ; CHECK-BE-NEXT: .LBB2_1: # %entry ; CHECK-BE-NEXT: # ; CHECK-BE-NEXT: stdu r12, -4096(r1) ; CHECK-BE-NEXT: bdnz .LBB2_1 ; CHECK-BE-NEXT: # %bb.2: # %entry ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, 64(r1) ; CHECK-BE-NEXT: lbz r3, 64(r1) ; CHECK-BE-NEXT: ld r1, 0(r1) ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f2: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: mr r12, r1 ; CHECK-32-NEXT: stwu r12, -16(r1) ; CHECK-32-NEXT: li r0, 16 ; CHECK-32-NEXT: mtctr r0 ; CHECK-32-NEXT: .LBB2_1: # %entry ; CHECK-32-NEXT: # ; CHECK-32-NEXT: stwu r12, -4096(r1) ; CHECK-32-NEXT: bdnz .LBB2_1 ; CHECK-32-NEXT: # %bb.2: # %entry ; CHECK-32-NEXT: sub r0, r1, r12 ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: sub r0, r1, r0 ; CHECK-32-NEXT: stb r3, 16(r1) ; CHECK-32-NEXT: mr r0, r31 ; CHECK-32-NEXT: lbz r3, 16(r1) ; CHECK-32-NEXT: lwz r31, 0(r1) ; CHECK-32-NEXT: mr r1, r31 ; CHECK-32-NEXT: mr r31, r0 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 65536 %b = getelementptr inbounds i8, i8* %a, i64 63 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } define i8 @f3() #0 "stack-probe-size"="32768" nounwind { ; CHECK-LE-LABEL: f3: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: mr r12, r1 ; CHECK-LE-NEXT: stdu r12, -48(r1) ; CHECK-LE-NEXT: stdu r12, -32768(r1) ; CHECK-LE-NEXT: stdu r12, -32768(r1) ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, 48(r1) ; CHECK-LE-NEXT: lbz r3, 48(r1) ; CHECK-LE-NEXT: ld r1, 0(r1) ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f3: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: mr r12, r1 ; CHECK-BE-NEXT: stdu r12, -64(r1) ; CHECK-BE-NEXT: stdu r12, -32768(r1) ; CHECK-BE-NEXT: stdu r12, -32768(r1) ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, 64(r1) ; CHECK-BE-NEXT: lbz r3, 64(r1) ; CHECK-BE-NEXT: ld r1, 0(r1) ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f3: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: mr r12, r1 ; CHECK-32-NEXT: stwu r12, -16(r1) ; CHECK-32-NEXT: stwu r12, -32768(r1) ; CHECK-32-NEXT: stwu r12, -32768(r1) ; CHECK-32-NEXT: sub r0, r1, r12 ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: sub r0, r1, r0 ; CHECK-32-NEXT: stb r3, 16(r1) ; CHECK-32-NEXT: mr r0, r31 ; CHECK-32-NEXT: lbz r3, 16(r1) ; CHECK-32-NEXT: lwz r31, 0(r1) ; CHECK-32-NEXT: mr r1, r31 ; CHECK-32-NEXT: mr r31, r0 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 65536 %b = getelementptr inbounds i8, i8* %a, i64 63 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } ; Same as f2, but without protection. define i8 @f4() nounwind { ; CHECK-LE-LABEL: f4: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: lis r0, -2 ; CHECK-LE-NEXT: ori r0, r0, 65488 ; CHECK-LE-NEXT: stdux r1, r1, r0 ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, 48(r1) ; CHECK-LE-NEXT: lbz r3, 48(r1) ; CHECK-LE-NEXT: ld r1, 0(r1) ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f4: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: lis r0, -2 ; CHECK-BE-NEXT: ori r0, r0, 65472 ; CHECK-BE-NEXT: stdux r1, r1, r0 ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, 64(r1) ; CHECK-BE-NEXT: lbz r3, 64(r1) ; CHECK-BE-NEXT: ld r1, 0(r1) ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f4: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: lis r0, -2 ; CHECK-32-NEXT: ori r0, r0, 65520 ; CHECK-32-NEXT: stwux r1, r1, r0 ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: sub r0, r1, r0 ; CHECK-32-NEXT: stb r3, 16(r1) ; CHECK-32-NEXT: mr r0, r31 ; CHECK-32-NEXT: lbz r3, 16(r1) ; CHECK-32-NEXT: lwz r31, 0(r1) ; CHECK-32-NEXT: mr r1, r31 ; CHECK-32-NEXT: mr r31, r0 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 65536 %b = getelementptr inbounds i8, i8* %a, i64 63 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } define i8 @f5() #0 "stack-probe-size"="65536" nounwind { ; CHECK-LE-LABEL: f5: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: mr r12, r1 ; CHECK-LE-NEXT: stdu r12, -48(r1) ; CHECK-LE-NEXT: li r0, 16 ; CHECK-LE-NEXT: mtctr r0 ; CHECK-LE-NEXT: lis r0, -1 ; CHECK-LE-NEXT: nop ; CHECK-LE-NEXT: .LBB5_1: # %entry ; CHECK-LE-NEXT: # ; CHECK-LE-NEXT: stdux r12, r1, r0 ; CHECK-LE-NEXT: bdnz .LBB5_1 ; CHECK-LE-NEXT: # %bb.2: # %entry ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, 48(r1) ; CHECK-LE-NEXT: lbz r3, 48(r1) ; CHECK-LE-NEXT: ld r1, 0(r1) ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f5: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: mr r12, r1 ; CHECK-BE-NEXT: stdu r12, -64(r1) ; CHECK-BE-NEXT: li r0, 16 ; CHECK-BE-NEXT: mtctr r0 ; CHECK-BE-NEXT: lis r0, -1 ; CHECK-BE-NEXT: nop ; CHECK-BE-NEXT: .LBB5_1: # %entry ; CHECK-BE-NEXT: # ; CHECK-BE-NEXT: stdux r12, r1, r0 ; CHECK-BE-NEXT: bdnz .LBB5_1 ; CHECK-BE-NEXT: # %bb.2: # %entry ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, 64(r1) ; CHECK-BE-NEXT: lbz r3, 64(r1) ; CHECK-BE-NEXT: ld r1, 0(r1) ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f5: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: mr r12, r1 ; CHECK-32-NEXT: stwu r12, -16(r1) ; CHECK-32-NEXT: li r0, 16 ; CHECK-32-NEXT: mtctr r0 ; CHECK-32-NEXT: lis r0, -1 ; CHECK-32-NEXT: nop ; CHECK-32-NEXT: .LBB5_1: # %entry ; CHECK-32-NEXT: # ; CHECK-32-NEXT: stwux r12, r1, r0 ; CHECK-32-NEXT: bdnz .LBB5_1 ; CHECK-32-NEXT: # %bb.2: # %entry ; CHECK-32-NEXT: sub r0, r1, r12 ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: sub r0, r1, r0 ; CHECK-32-NEXT: stb r3, 16(r1) ; CHECK-32-NEXT: mr r0, r31 ; CHECK-32-NEXT: lbz r3, 16(r1) ; CHECK-32-NEXT: lwz r31, 0(r1) ; CHECK-32-NEXT: mr r1, r31 ; CHECK-32-NEXT: mr r31, r0 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 1048576 %b = getelementptr inbounds i8, i8* %a, i64 63 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } define i8 @f6() #0 nounwind { ; CHECK-LE-LABEL: f6: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: mr r12, r1 ; CHECK-LE-NEXT: stdu r12, -48(r1) ; CHECK-LE-NEXT: lis r0, 4 ; CHECK-LE-NEXT: nop ; CHECK-LE-NEXT: mtctr r0 ; CHECK-LE-NEXT: .LBB6_1: # %entry ; CHECK-LE-NEXT: # ; CHECK-LE-NEXT: stdu r12, -4096(r1) ; CHECK-LE-NEXT: bdnz .LBB6_1 ; CHECK-LE-NEXT: # %bb.2: # %entry ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, 48(r1) ; CHECK-LE-NEXT: lbz r3, 48(r1) ; CHECK-LE-NEXT: ld r1, 0(r1) ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f6: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: mr r12, r1 ; CHECK-BE-NEXT: stdu r12, -64(r1) ; CHECK-BE-NEXT: lis r0, 4 ; CHECK-BE-NEXT: nop ; CHECK-BE-NEXT: mtctr r0 ; CHECK-BE-NEXT: .LBB6_1: # %entry ; CHECK-BE-NEXT: # ; CHECK-BE-NEXT: stdu r12, -4096(r1) ; CHECK-BE-NEXT: bdnz .LBB6_1 ; CHECK-BE-NEXT: # %bb.2: # %entry ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, 64(r1) ; CHECK-BE-NEXT: lbz r3, 64(r1) ; CHECK-BE-NEXT: ld r1, 0(r1) ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f6: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: mr r12, r1 ; CHECK-32-NEXT: stwu r12, -16(r1) ; CHECK-32-NEXT: lis r0, 4 ; CHECK-32-NEXT: nop ; CHECK-32-NEXT: mtctr r0 ; CHECK-32-NEXT: .LBB6_1: # %entry ; CHECK-32-NEXT: # ; CHECK-32-NEXT: stwu r12, -4096(r1) ; CHECK-32-NEXT: bdnz .LBB6_1 ; CHECK-32-NEXT: # %bb.2: # %entry ; CHECK-32-NEXT: sub r0, r1, r12 ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: sub r0, r1, r0 ; CHECK-32-NEXT: stb r3, 16(r1) ; CHECK-32-NEXT: mr r0, r31 ; CHECK-32-NEXT: lbz r3, 16(r1) ; CHECK-32-NEXT: lwz r31, 0(r1) ; CHECK-32-NEXT: mr r1, r31 ; CHECK-32-NEXT: mr r31, r0 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 1073741824 %b = getelementptr inbounds i8, i8* %a, i64 63 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } define i8 @f7() #0 "stack-probe-size"="65536" nounwind { ; CHECK-LE-LABEL: f7: ; CHECK-LE: # %bb.0: # %entry ; CHECK-LE-NEXT: lis r0, -1 ; CHECK-LE-NEXT: mr r12, r1 ; CHECK-LE-NEXT: ori r0, r0, 13776 ; CHECK-LE-NEXT: stdux r12, r1, r0 ; CHECK-LE-NEXT: li r0, 15258 ; CHECK-LE-NEXT: mtctr r0 ; CHECK-LE-NEXT: lis r0, -1 ; CHECK-LE-NEXT: nop ; CHECK-LE-NEXT: .LBB7_1: # %entry ; CHECK-LE-NEXT: # ; CHECK-LE-NEXT: stdux r12, r1, r0 ; CHECK-LE-NEXT: bdnz .LBB7_1 ; CHECK-LE-NEXT: # %bb.2: # %entry ; CHECK-LE-NEXT: li r3, 3 ; CHECK-LE-NEXT: stb r3, 41(r1) ; CHECK-LE-NEXT: lbz r3, 41(r1) ; CHECK-LE-NEXT: ld r1, 0(r1) ; CHECK-LE-NEXT: blr ; ; CHECK-BE-LABEL: f7: ; CHECK-BE: # %bb.0: # %entry ; CHECK-BE-NEXT: lis r0, -1 ; CHECK-BE-NEXT: mr r12, r1 ; CHECK-BE-NEXT: ori r0, r0, 13760 ; CHECK-BE-NEXT: stdux r12, r1, r0 ; CHECK-BE-NEXT: li r0, 15258 ; CHECK-BE-NEXT: mtctr r0 ; CHECK-BE-NEXT: lis r0, -1 ; CHECK-BE-NEXT: nop ; CHECK-BE-NEXT: .LBB7_1: # %entry ; CHECK-BE-NEXT: # ; CHECK-BE-NEXT: stdux r12, r1, r0 ; CHECK-BE-NEXT: bdnz .LBB7_1 ; CHECK-BE-NEXT: # %bb.2: # %entry ; CHECK-BE-NEXT: li r3, 3 ; CHECK-BE-NEXT: stb r3, 57(r1) ; CHECK-BE-NEXT: lbz r3, 57(r1) ; CHECK-BE-NEXT: ld r1, 0(r1) ; CHECK-BE-NEXT: blr ; ; CHECK-32-LABEL: f7: ; CHECK-32: # %bb.0: # %entry ; CHECK-32-NEXT: lis r0, -1 ; CHECK-32-NEXT: mr r12, r1 ; CHECK-32-NEXT: ori r0, r0, 13808 ; CHECK-32-NEXT: stwux r12, r1, r0 ; CHECK-32-NEXT: li r0, 15258 ; CHECK-32-NEXT: mtctr r0 ; CHECK-32-NEXT: lis r0, -1 ; CHECK-32-NEXT: nop ; CHECK-32-NEXT: .LBB7_1: # %entry ; CHECK-32-NEXT: # ; CHECK-32-NEXT: stwux r12, r1, r0 ; CHECK-32-NEXT: bdnz .LBB7_1 ; CHECK-32-NEXT: # %bb.2: # %entry ; CHECK-32-NEXT: sub r0, r1, r12 ; CHECK-32-NEXT: li r3, 3 ; CHECK-32-NEXT: sub r0, r1, r0 ; CHECK-32-NEXT: stb r3, 9(r1) ; CHECK-32-NEXT: mr r0, r31 ; CHECK-32-NEXT: lbz r3, 9(r1) ; CHECK-32-NEXT: lwz r31, 0(r1) ; CHECK-32-NEXT: mr r1, r31 ; CHECK-32-NEXT: mr r31, r0 ; CHECK-32-NEXT: blr entry: %a = alloca i8, i64 1000000007 %b = getelementptr inbounds i8, i8* %a, i64 101 store volatile i8 3, i8* %a %c = load volatile i8, i8* %a ret i8 %c } attributes #0 = { "probe-stack"="inline-asm" }