223 lines · plain
1; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -verify-machineinstrs -disable-post-ra \2; RUN: -global-isel=0 -o - %s | FileCheck %s3; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -verify-machineinstrs -disable-post-ra \4; RUN: -global-isel=1 -global-isel-abort=1 -o - %s | FileCheck %s5 6define i32 @test() #0 {7; CHECK-LABEL: test:8; CHECK: %bb.0:9; CHECK-NEXT: str x19, [sp, #-16]!10; CHECK-NEXT: mov w0, wzr11; CHECK-NEXT: //APP12; CHECK-NEXT: //NO_APP13; CHECK-NEXT: ldr x19, [sp], #1614; CHECK-NEXT: ret15 call void asm sideeffect "", "~{x19}"()16 ret i32 017}18 19define i32 @test_alloca() #0 {20; CHECK-LABEL: test_alloca:21; CHECK: %bb.0:22; CHECK-NEXT: sub sp, sp, #3223; CHECK-NEXT: mov x8, sp24; CHECK-NEXT: mov w0, wzr25; CHECK-NEXT: //APP26; CHECK-NEXT: //NO_APP27; CHECK-NEXT: add sp, sp, #3228; CHECK-NEXT: ret29 %p = alloca i8, i32 3230 call void asm sideeffect "", "r"(ptr %p)31 ret i32 032}33 34define i32 @test_realign_alloca() #0 {35; CHECK-LABEL: test_realign_alloca:36; CHECK: %bb.0:37; CHECK-NEXT: pacibsp38; CHECK-NEXT: stp x29, x30, [sp, #-16]!39; CHECK-NEXT: mov x29, sp40; CHECK-NEXT: sub x9, sp, #11241; CHECK-NEXT: and sp, x9, #0xffffffffffffff8042; CHECK-NEXT: mov x8, sp43; CHECK-NEXT: mov w0, wzr44; CHECK-NEXT: //APP45; CHECK-NEXT: //NO_APP46; CHECK-NEXT: mov sp, x2947; CHECK-NEXT: ldp x29, x30, [sp], #1648; CHECK-NEXT: retab49 %p = alloca i8, i32 32, align 12850 call void asm sideeffect "", "r"(ptr %p)51 ret i32 052}53 54define i32 @test_big_alloca() #0 {55; CHECK-LABEL: test_big_alloca:56; CHECK: %bb.0:57; CHECK-NEXT: str x29, [sp, #-16]!58; CHECK-NEXT: sub sp, sp, #102459; CHECK-NEXT: mov x8, sp60; CHECK-NEXT: mov w0, wzr61; CHECK-NEXT: //APP62; CHECK-NEXT: //NO_APP63; CHECK-NEXT: add sp, sp, #102464; CHECK-NEXT: ldr x29, [sp], #1665; CHECK-NEXT: ret66 %p = alloca i8, i32 102467 call void asm sideeffect "", "r"(ptr %p)68 ret i32 069}70 71define i32 @test_var_alloca(i32 %s) #0 {72 %p = alloca i8, i32 %s73 call void asm sideeffect "", "r"(ptr %p)74 ret i32 075}76 77define i32 @test_noframe_saved(ptr %p) #0 {78; CHECK-LABEL: test_noframe_saved:79; CHECK: %bb.0:80 81 82; CHECK-NEXT: str x29, [sp, #-96]!83; CHECK-NEXT: stp x28, x27, [sp, #16]84; CHECK-NEXT: stp x26, x25, [sp, #32]85; CHECK-NEXT: stp x24, x23, [sp, #48]86; CHECK-NEXT: stp x22, x21, [sp, #64]87; CHECK-NEXT: stp x20, x19, [sp, #80]88; CHECK-NEXT: ldr w29, [x0]89; CHECK-NEXT: //APP90; CHECK-NEXT: //NO_APP91; CHECK-NEXT: mov w0, w2992; CHECK-NEXT: ldp x20, x19, [sp, #80]93; CHECK-NEXT: ldp x22, x21, [sp, #64]94; CHECK-NEXT: ldp x24, x23, [sp, #48]95; CHECK-NEXT: ldp x26, x25, [sp, #32]96; CHECK-NEXT: ldp x28, x27, [sp, #16]97; CHECK-NEXT: ldr x29, [sp], #9698; CHECK-NEXT: ret99 %v = load i32, ptr %p100 call void asm sideeffect "", "~{x0},~{x1},~{x2},~{x3},~{x4},~{x5},~{x6},~{x7},~{x8},~{x9},~{x10},~{x11},~{x12},~{x13},~{x14},~{x15},~{x16},~{x17},~{x18},~{x19},~{x20},~{x21},~{x22},~{x23},~{x24},~{x25},~{x26},~{x27},~{x28}"()101 ret i32 %v102}103 104define void @test_noframe() #0 {105; CHECK-LABEL: test_noframe:106; CHECK: %bb.0:107; CHECK-NEXT: ret108 ret void109}110 111; FIXME: Inefficient lowering of @llvm.returnaddress112define ptr @test_returnaddress_0() #0 {113; CHECK-LABEL: test_returnaddress_0:114; CHECK: %bb.0:115; CHECK-NEXT: mov x0, x30116; CHECK-NEXT: xpaci x0117; CHECK-NEXT: ret118 %r = call ptr @llvm.returnaddress(i32 0)119 ret ptr %r120}121 122define ptr @test_returnaddress_1() #0 {123; CHECK-LABEL: test_returnaddress_1:124; CHECK: %bb.0:125; CHECK-NEXT: pacibsp126; CHECK-NEXT: stp x29, x30, [sp, #-16]!127; CHECK-NEXT: mov x29, sp128; CHECK-NEXT: ldr x8, [x29]129; CHECK-NEXT: ldr x0, [x8, #8]130; CHECK-NEXT: xpaci x0131; CHECK-NEXT: ldp x29, x30, [sp], #16132; CHECK-NEXT: retab133 %r = call ptr @llvm.returnaddress(i32 1)134 ret ptr %r135}136 137define void @test_noframe_alloca() #0 {138; CHECK-LABEL: test_noframe_alloca:139; CHECK: %bb.0:140; CHECK-NEXT: sub sp, sp, #16141; CHECK-NEXT: add x8, sp, #12142; CHECK-NEXT: //APP143; CHECK-NEXT: //NO_APP144; CHECK-NEXT: add sp, sp, #16145; CHECK-NEXT: ret146 %p = alloca i8, i32 1147 call void asm sideeffect "", "r"(ptr %p)148 ret void149}150 151define void @test_call() #0 {152; CHECK-LABEL: test_call:153; CHECK: %bb.0:154; CHECK-NEXT: pacibsp155; CHECK-NEXT: str x30, [sp, #-16]!156; CHECK-NEXT: bl bar157; CHECK-NEXT: ldr x30, [sp], #16158; CHECK-NEXT: retab159 call i32 @bar()160 ret void161}162 163define void @test_call_alloca() #0 {164; CHECK-LABEL: test_call_alloca:165; CHECK: %bb.0:166; CHECK-NEXT: pacibsp167; CHECK-NEXT: str x30, [sp, #-16]168; CHECK-NEXT: bl bar169; CHECK-NEXT: ldr x30, [sp], #16170; CHECK-NEXT: retab171 alloca i8172 call i32 @bar()173 ret void174}175 176define void @test_call_shrinkwrapping(i1 %c) #0 {177; CHECK-LABEL: test_call_shrinkwrapping:178; CHECK: %bb.0:179; CHECK-NEXT: tbz w0, #0, .LBB12_2180; CHECK-NEXT: %bb.1:181; CHECK-NEXT: pacibsp182; CHECK-NEXT: str x30, [sp, #-16]!183; CHECK-NEXT: bl bar184; CHECK-NEXT: ldr x30, [sp], #16185; CHECK-NEXT: autibsp186; CHECK-NEXT: LBB12_2:187; CHECK-NEXT: ret188 br i1 %c, label %tbb, label %fbb189tbb:190 call i32 @bar()191 br label %fbb192fbb:193 ret void194}195 196define i32 @test_tailcall() #0 {197; CHECK-LABEL: test_tailcall:198; CHECK: %bb.0:199; CHECK-NEXT: pacibsp200; CHECK-NEXT: str x30, [sp, #-16]!201; CHECK-NEXT: bl bar202; CHECK-NEXT: ldr x30, [sp], #16203; CHECK-NEXT: autibsp204; CHECK-NEXT: b bar205 call i32 @bar()206 %c = tail call i32 @bar()207 ret i32 %c208}209 210define i32 @test_tailcall_noframe() #0 {211; CHECK-LABEL: test_tailcall_noframe:212; CHECK: %bb.0:213; CHECK-NEXT: b bar214 %c = tail call i32 @bar()215 ret i32 %c216}217 218declare i32 @bar()219 220declare ptr @llvm.returnaddress(i32)221 222attributes #0 = { nounwind "ptrauth-returns" }223