; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
;; direct-access-external-data is false due to PIC Level, so __stack_chk_guard
;; is dso_preemtable. Check that we use GOT PIC code sequence as well because
;; R_ARM_GOT_ABS does not have assembler support.
; RUN: llc -relocation-model=static < %s | FileCheck %s
; RUN: llc -relocation-model=pic < %s | FileCheck %s
;; Also check Thumb1 and Thumb2.
; RUN: llc -mtriple=thumbv6-linux-gnueabi -relocation-model=static < %s | FileCheck %s --check-prefix=THUMB1
; RUN: llc -mtriple=thumbv6-linux-gnueabi -relocation-model=pic < %s | FileCheck %s --check-prefix=THUMB1-PIC
; RUN: llc -mtriple=thumbv7-linux-gnueabi -relocation-model=static < %s | FileCheck %s --check-prefix=THUMB2
; RUN: llc -mtriple=thumbv7-linux-gnueabi -relocation-model=pic < %s | FileCheck %s --check-prefix=THUMB2-PIC
target triple = "armv7a-linux-gnueabi"
define i32 @test1() #0 {
; CHECK-LABEL: test1:
; CHECK: @ %bb.0:
; CHECK-NEXT: push {r11, lr}
; CHECK-NEXT: sub sp, sp, #8
; CHECK-NEXT: sub sp, sp, #1024
; CHECK-NEXT: ldr r0, .LCPI0_0
; CHECK-NEXT: .LPC0_0:
; CHECK-NEXT: add r0, pc, r0
; CHECK-NEXT: ldr r0, [r0]
; CHECK-NEXT: ldr r0, [r0]
; CHECK-NEXT: str r0, [sp, #1028]
; CHECK-NEXT: add r0, sp, #4
; CHECK-NEXT: bl foo
; CHECK-NEXT: ldr r0, [sp, #1028]
; CHECK-NEXT: ldr r1, .LCPI0_1
; CHECK-NEXT: .LPC0_1:
; CHECK-NEXT: add r1, pc, r1
; CHECK-NEXT: ldr r1, [r1]
; CHECK-NEXT: ldr r1, [r1]
; CHECK-NEXT: cmp r1, r0
; CHECK-NEXT: moveq r0, #0
; CHECK-NEXT: addeq sp, sp, #8
; CHECK-NEXT: addeq sp, sp, #1024
; CHECK-NEXT: popeq {r11, pc}
; CHECK-NEXT: .LBB0_1:
; CHECK-NEXT: bl __stack_chk_fail
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: @ %bb.2:
; CHECK-NEXT: .LCPI0_0:
; CHECK-NEXT: .Ltmp0:
; CHECK-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_0+8)-.Ltmp0)
; CHECK-NEXT: .LCPI0_1:
; CHECK-NEXT: .Ltmp1:
; CHECK-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_1+8)-.Ltmp1)
;
; THUMB1-LABEL: test1:
; THUMB1: @ %bb.0:
; THUMB1-NEXT: .save {r4, r5, r6, lr}
; THUMB1-NEXT: push {r4, r5, r6, lr}
; THUMB1-NEXT: .pad #508
; THUMB1-NEXT: sub sp, #508
; THUMB1-NEXT: .pad #508
; THUMB1-NEXT: sub sp, #508
; THUMB1-NEXT: .pad #16
; THUMB1-NEXT: sub sp, #16
; THUMB1-NEXT: ldr r0, .LCPI0_0
; THUMB1-NEXT: .LPC0_0:
; THUMB1-NEXT: add r0, pc
; THUMB1-NEXT: ldr r0, [r0]
; THUMB1-NEXT: ldr r0, [r0]
; THUMB1-NEXT: add r1, sp, #904
; THUMB1-NEXT: str r0, [r1, #124]
; THUMB1-NEXT: add r0, sp, #4
; THUMB1-NEXT: bl foo
; THUMB1-NEXT: add r0, sp, #904
; THUMB1-NEXT: ldr r0, [r0, #124]
; THUMB1-NEXT: ldr r1, .LCPI0_1
; THUMB1-NEXT: .LPC0_1:
; THUMB1-NEXT: add r1, pc
; THUMB1-NEXT: ldr r1, [r1]
; THUMB1-NEXT: ldr r1, [r1]
; THUMB1-NEXT: cmp r1, r0
; THUMB1-NEXT: bne .LBB0_2
; THUMB1-NEXT: @ %bb.1:
; THUMB1-NEXT: movs r0, #0
; THUMB1-NEXT: add sp, #508
; THUMB1-NEXT: add sp, #508
; THUMB1-NEXT: add sp, #16
; THUMB1-NEXT: pop {r4, r5, r6, pc}
; THUMB1-NEXT: .LBB0_2:
; THUMB1-NEXT: bl __stack_chk_fail
; THUMB1-NEXT: .p2align 2
; THUMB1-NEXT: @ %bb.3:
; THUMB1-NEXT: .LCPI0_0:
; THUMB1-NEXT: .Ltmp0:
; THUMB1-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_0+4)-.Ltmp0)
; THUMB1-NEXT: .LCPI0_1:
; THUMB1-NEXT: .Ltmp1:
; THUMB1-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_1+4)-.Ltmp1)
;
; THUMB1-PIC-LABEL: test1:
; THUMB1-PIC: @ %bb.0:
; THUMB1-PIC-NEXT: .save {r4, r5, r6, lr}
; THUMB1-PIC-NEXT: push {r4, r5, r6, lr}
; THUMB1-PIC-NEXT: .pad #508
; THUMB1-PIC-NEXT: sub sp, #508
; THUMB1-PIC-NEXT: .pad #508
; THUMB1-PIC-NEXT: sub sp, #508
; THUMB1-PIC-NEXT: .pad #16
; THUMB1-PIC-NEXT: sub sp, #16
; THUMB1-PIC-NEXT: ldr r0, .LCPI0_0
; THUMB1-PIC-NEXT: .LPC0_0:
; THUMB1-PIC-NEXT: add r0, pc
; THUMB1-PIC-NEXT: ldr r0, [r0]
; THUMB1-PIC-NEXT: ldr r0, [r0]
; THUMB1-PIC-NEXT: add r1, sp, #904
; THUMB1-PIC-NEXT: str r0, [r1, #124]
; THUMB1-PIC-NEXT: add r0, sp, #4
; THUMB1-PIC-NEXT: bl foo
; THUMB1-PIC-NEXT: add r0, sp, #904
; THUMB1-PIC-NEXT: ldr r0, [r0, #124]
; THUMB1-PIC-NEXT: ldr r1, .LCPI0_1
; THUMB1-PIC-NEXT: .LPC0_1:
; THUMB1-PIC-NEXT: add r1, pc
; THUMB1-PIC-NEXT: ldr r1, [r1]
; THUMB1-PIC-NEXT: ldr r1, [r1]
; THUMB1-PIC-NEXT: cmp r1, r0
; THUMB1-PIC-NEXT: bne .LBB0_2
; THUMB1-PIC-NEXT: @ %bb.1:
; THUMB1-PIC-NEXT: movs r0, #0
; THUMB1-PIC-NEXT: add sp, #508
; THUMB1-PIC-NEXT: add sp, #508
; THUMB1-PIC-NEXT: add sp, #16
; THUMB1-PIC-NEXT: pop {r4, r5, r6, pc}
; THUMB1-PIC-NEXT: .LBB0_2:
; THUMB1-PIC-NEXT: bl __stack_chk_fail
; THUMB1-PIC-NEXT: .p2align 2
; THUMB1-PIC-NEXT: @ %bb.3:
; THUMB1-PIC-NEXT: .LCPI0_0:
; THUMB1-PIC-NEXT: .Ltmp0:
; THUMB1-PIC-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_0+4)-.Ltmp0)
; THUMB1-PIC-NEXT: .LCPI0_1:
; THUMB1-PIC-NEXT: .Ltmp1:
; THUMB1-PIC-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_1+4)-.Ltmp1)
;
; THUMB2-LABEL: test1:
; THUMB2: @ %bb.0:
; THUMB2-NEXT: .save {r7, lr}
; THUMB2-NEXT: push {r7, lr}
; THUMB2-NEXT: .pad #1032
; THUMB2-NEXT: sub.w sp, sp, #1032
; THUMB2-NEXT: ldr r0, .LCPI0_0
; THUMB2-NEXT: .LPC0_0:
; THUMB2-NEXT: add r0, pc
; THUMB2-NEXT: ldr r0, [r0]
; THUMB2-NEXT: ldr r0, [r0]
; THUMB2-NEXT: str.w r0, [sp, #1028]
; THUMB2-NEXT: add r0, sp, #4
; THUMB2-NEXT: bl foo
; THUMB2-NEXT: ldr.w r0, [sp, #1028]
; THUMB2-NEXT: ldr r1, .LCPI0_1
; THUMB2-NEXT: .LPC0_1:
; THUMB2-NEXT: add r1, pc
; THUMB2-NEXT: ldr r1, [r1]
; THUMB2-NEXT: ldr r1, [r1]
; THUMB2-NEXT: cmp r1, r0
; THUMB2-NEXT: ittt eq
; THUMB2-NEXT: moveq r0, #0
; THUMB2-NEXT: addeq.w sp, sp, #1032
; THUMB2-NEXT: popeq {r7, pc}
; THUMB2-NEXT: .LBB0_1:
; THUMB2-NEXT: bl __stack_chk_fail
; THUMB2-NEXT: .p2align 2
; THUMB2-NEXT: @ %bb.2:
; THUMB2-NEXT: .LCPI0_0:
; THUMB2-NEXT: .Ltmp0:
; THUMB2-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_0+4)-.Ltmp0)
; THUMB2-NEXT: .LCPI0_1:
; THUMB2-NEXT: .Ltmp1:
; THUMB2-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_1+4)-.Ltmp1)
;
; THUMB2-PIC-LABEL: test1:
; THUMB2-PIC: @ %bb.0:
; THUMB2-PIC-NEXT: .save {r7, lr}
; THUMB2-PIC-NEXT: push {r7, lr}
; THUMB2-PIC-NEXT: .pad #1032
; THUMB2-PIC-NEXT: sub.w sp, sp, #1032
; THUMB2-PIC-NEXT: ldr r0, .LCPI0_0
; THUMB2-PIC-NEXT: .LPC0_0:
; THUMB2-PIC-NEXT: add r0, pc
; THUMB2-PIC-NEXT: ldr r0, [r0]
; THUMB2-PIC-NEXT: ldr r0, [r0]
; THUMB2-PIC-NEXT: str.w r0, [sp, #1028]
; THUMB2-PIC-NEXT: add r0, sp, #4
; THUMB2-PIC-NEXT: bl foo
; THUMB2-PIC-NEXT: ldr.w r0, [sp, #1028]
; THUMB2-PIC-NEXT: ldr r1, .LCPI0_1
; THUMB2-PIC-NEXT: .LPC0_1:
; THUMB2-PIC-NEXT: add r1, pc
; THUMB2-PIC-NEXT: ldr r1, [r1]
; THUMB2-PIC-NEXT: ldr r1, [r1]
; THUMB2-PIC-NEXT: cmp r1, r0
; THUMB2-PIC-NEXT: ittt eq
; THUMB2-PIC-NEXT: moveq r0, #0
; THUMB2-PIC-NEXT: addeq.w sp, sp, #1032
; THUMB2-PIC-NEXT: popeq {r7, pc}
; THUMB2-PIC-NEXT: .LBB0_1:
; THUMB2-PIC-NEXT: bl __stack_chk_fail
; THUMB2-PIC-NEXT: .p2align 2
; THUMB2-PIC-NEXT: @ %bb.2:
; THUMB2-PIC-NEXT: .LCPI0_0:
; THUMB2-PIC-NEXT: .Ltmp0:
; THUMB2-PIC-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_0+4)-.Ltmp0)
; THUMB2-PIC-NEXT: .LCPI0_1:
; THUMB2-PIC-NEXT: .Ltmp1:
; THUMB2-PIC-NEXT: .long __stack_chk_guard(GOT_PREL)-((.LPC0_1+4)-.Ltmp1)
%a1 = alloca [256 x i32], align 4
call void @foo(ptr %a1) #3
ret i32 0
}
declare void @foo(ptr)
attributes #0 = { nounwind sspstrong }
!llvm.module.flags = !{!0}
!0 = !{i32 8, !"PIC Level", i32 2}