brintos

brintos / llvm-project-archived public Read only

0
0
Text · 29.1 KiB · 52b38a5 Raw
883 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0                    -verify-machineinstrs \3; RUN:   -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefixes=UNCHECKED,UNCHECKED-DARWIN4; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \5; RUN:   -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefixes=UNCHECKED,UNCHECKED-DARWIN6 7; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0                    -verify-machineinstrs \8; RUN:                                     | FileCheck %s -DL="L" --check-prefixes=CHECKED,CHECKED-DARWIN9; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \10; RUN:                                     | FileCheck %s -DL="L" --check-prefixes=CHECKED,CHECKED-DARWIN11 12; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0                    -verify-machineinstrs \13; RUN:   -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL="L" --check-prefixes=TRAP,TRAP-DARWIN14; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \15; RUN:   -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL="L" --check-prefixes=TRAP,TRAP-DARWIN16 17; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0                    -verify-machineinstrs \18; RUN:   -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefixes=UNCHECKED,UNCHECKED-ELF19; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \20; RUN:   -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefixes=UNCHECKED,UNCHECKED-ELF21 22; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0                    -verify-machineinstrs \23; RUN:                                     | FileCheck %s -DL=".L" --check-prefixes=CHECKED,CHECKED-ELF24; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \25; RUN:                                     | FileCheck %s -DL=".L" --check-prefixes=CHECKED,CHECKED-ELF26 27; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0                    -verify-machineinstrs \28; RUN:   -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL=".L" --check-prefixes=TRAP,TRAP-ELF29; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \30; RUN:   -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL=".L" --check-prefixes=TRAP,TRAP-ELF31 32target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"33 34define i64 @test_auth_ia(i64 %arg, i64 %arg1) {35; UNCHECKED-LABEL: test_auth_ia:36; UNCHECKED:           %bb.0:37; UNCHECKED-DARWIN-NEXT: mov x16, x038; UNCHECKED-DARWIN-NEXT: autia x16, x139; UNCHECKED-DARWIN-NEXT: mov x0, x1640; UNCHECKED-ELF-NEXT:    autia x0, x141; UNCHECKED-NEXT:        ret42;43; CHECKED-LABEL: test_auth_ia:44; CHECKED:           %bb.0:45; CHECKED-DARWIN-NEXT: mov x16, x046; CHECKED-DARWIN-NEXT: autia x16, x147; CHECKED-DARWIN-NEXT: mov x0, x1648; CHECKED-ELF-NEXT:    autia x0, x149; CHECKED-NEXT:        ret50;51; TRAP-LABEL: test_auth_ia:52; TRAP:       %bb.0:53; TRAP-DARWIN-NEXT:   mov x16, x054; TRAP-DARWIN-NEXT:   autia x16, x155; TRAP-DARWIN-NEXT:   mov x17, x1656; TRAP-DARWIN-NEXT:   xpaci x1757; TRAP-DARWIN-NEXT:   cmp x16, x1758; TRAP-ELF-NEXT:   autia x0, x159; TRAP-ELF-NEXT:   mov x8, x060; TRAP-ELF-NEXT:   xpaci x861; TRAP-ELF-NEXT:   cmp x0, x862; TRAP-NEXT:    b.eq [[L]]auth_success_063; TRAP-NEXT:    brk #0xc47064; TRAP-NEXT:  Lauth_success_0:65; TRAP-DARWIN-NEXT:    mov x0, x1666; TRAP-NEXT:    ret67  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 0, i64 %arg1)68  ret i64 %tmp69}70 71define i64 @test_auth_ia_zero(i64 %arg) {72; UNCHECKED-LABEL: test_auth_ia_zero:73; UNCHECKED:           %bb.0:74; UNCHECKED-DARWIN-NEXT: mov x16, x075; UNCHECKED-DARWIN-NEXT: autiza x1676; UNCHECKED-DARWIN-NEXT: mov x0, x1677; UNCHECKED-ELF-NEXT:    autiza x078; UNCHECKED-NEXT:        ret79;80; CHECKED-LABEL: test_auth_ia_zero:81; CHECKED:           %bb.0:82; CHECKED-DARWIN-NEXT: mov x16, x083; CHECKED-DARWIN-NEXT: autiza x1684; CHECKED-DARWIN-NEXT: mov x0, x1685; CHECKED-ELF-NEXT:    autiza x086; CHECKED-NEXT:        ret87;88; TRAP-LABEL: test_auth_ia_zero:89; TRAP:       %bb.0:90; TRAP-DARWIN-NEXT:   mov x16, x091; TRAP-DARWIN-NEXT:   autiza x1692; TRAP-DARWIN-NEXT:   mov x17, x1693; TRAP-DARWIN-NEXT:   xpaci x1794; TRAP-DARWIN-NEXT:   cmp x16, x1795; TRAP-ELF-NEXT:   autiza x096; TRAP-ELF-NEXT:   mov x8, x097; TRAP-ELF-NEXT:   xpaci x898; TRAP-ELF-NEXT:   cmp x0, x899; TRAP-NEXT:    b.eq [[L]]auth_success_1100; TRAP-NEXT:    brk #0xc470101; TRAP-NEXT:  Lauth_success_1:102; TRAP-DARWIN-NEXT:    mov x0, x16103; TRAP-NEXT:    ret104  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 0, i64 0)105  ret i64 %tmp106}107 108define i64 @test_auth_ib(i64 %arg, i64 %arg1) {109; UNCHECKED-LABEL: test_auth_ib:110; UNCHECKED:           %bb.0:111; UNCHECKED-DARWIN-NEXT: mov x16, x0112; UNCHECKED-DARWIN-NEXT: autib x16, x1113; UNCHECKED-DARWIN-NEXT: mov x0, x16114; UNCHECKED-ELF-NEXT:    autib x0, x1115; UNCHECKED-NEXT:        ret116;117; CHECKED-LABEL: test_auth_ib:118; CHECKED:           %bb.0:119; CHECKED-DARWIN-NEXT: mov x16, x0120; CHECKED-DARWIN-NEXT: autib x16, x1121; CHECKED-DARWIN-NEXT: mov x0, x16122; CHECKED-ELF-NEXT:    autib x0, x1123; CHECKED-NEXT:        ret124;125; TRAP-LABEL: test_auth_ib:126; TRAP:       %bb.0:127; TRAP-DARWIN-NEXT:   mov x16, x0128; TRAP-DARWIN-NEXT:   autib x16, x1129; TRAP-DARWIN-NEXT:   mov x17, x16130; TRAP-DARWIN-NEXT:   xpaci x17131; TRAP-DARWIN-NEXT:   cmp x16, x17132; TRAP-ELF-NEXT:   autib x0, x1133; TRAP-ELF-NEXT:   mov x8, x0134; TRAP-ELF-NEXT:   xpaci x8135; TRAP-ELF-NEXT:   cmp x0, x8136; TRAP-NEXT:    b.eq [[L]]auth_success_2137; TRAP-NEXT:    brk #0xc471138; TRAP-NEXT:  Lauth_success_2:139; TRAP-DARWIN-NEXT:    mov x0, x16140; TRAP-NEXT:    ret141  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 1, i64 %arg1)142  ret i64 %tmp143}144 145define i64 @test_auth_ib_zero(i64 %arg) {146; UNCHECKED-LABEL: test_auth_ib_zero:147; UNCHECKED:           %bb.0:148; UNCHECKED-DARWIN-NEXT: mov x16, x0149; UNCHECKED-DARWIN-NEXT: autizb x16150; UNCHECKED-DARWIN-NEXT: mov x0, x16151; UNCHECKED-ELF-NEXT:    autizb x0152; UNCHECKED-NEXT:        ret153;154; CHECKED-LABEL: test_auth_ib_zero:155; CHECKED:           %bb.0:156; CHECKED-DARWIN-NEXT: mov x16, x0157; CHECKED-DARWIN-NEXT: autizb x16158; CHECKED-DARWIN-NEXT: mov x0, x16159; CHECKED-ELF-NEXT:    autizb x0160; CHECKED-NEXT:        ret161;162; TRAP-LABEL: test_auth_ib_zero:163; TRAP:       %bb.0:164; TRAP-DARWIN-NEXT:   mov x16, x0165; TRAP-DARWIN-NEXT:   autizb x16166; TRAP-DARWIN-NEXT:   mov x17, x16167; TRAP-DARWIN-NEXT:   xpaci x17168; TRAP-DARWIN-NEXT:   cmp x16, x17169; TRAP-ELF-NEXT:   autizb x0170; TRAP-ELF-NEXT:   mov x8, x0171; TRAP-ELF-NEXT:   xpaci x8172; TRAP-ELF-NEXT:   cmp x0, x8173; TRAP-NEXT:    b.eq [[L]]auth_success_3174; TRAP-NEXT:    brk #0xc471175; TRAP-NEXT:  Lauth_success_3:176; TRAP-DARWIN-NEXT:    mov x0, x16177; TRAP-NEXT:    ret178  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 1, i64 0)179  ret i64 %tmp180}181 182define i64 @test_auth_da(i64 %arg, i64 %arg1) {183; UNCHECKED-LABEL: test_auth_da:184; UNCHECKED:           %bb.0:185; UNCHECKED-DARWIN-NEXT: mov x16, x0186; UNCHECKED-DARWIN-NEXT: autda x16, x1187; UNCHECKED-DARWIN-NEXT: mov x0, x16188; UNCHECKED-ELF-NEXT:    autda x0, x1189; UNCHECKED-NEXT:        ret190;191; CHECKED-LABEL: test_auth_da:192; CHECKED:           %bb.0:193; CHECKED-DARWIN-NEXT: mov x16, x0194; CHECKED-DARWIN-NEXT: autda x16, x1195; CHECKED-DARWIN-NEXT: mov x0, x16196; CHECKED-ELF-NEXT:    autda x0, x1197; CHECKED-NEXT:        ret198;199; TRAP-LABEL: test_auth_da:200; TRAP:       %bb.0:201; TRAP-DARWIN-NEXT:   mov x16, x0202; TRAP-DARWIN-NEXT:   autda x16, x1203; TRAP-DARWIN-NEXT:   mov x17, x16204; TRAP-DARWIN-NEXT:   xpacd x17205; TRAP-DARWIN-NEXT:   cmp x16, x17206; TRAP-ELF-NEXT:   autda x0, x1207; TRAP-ELF-NEXT:   mov x8, x0208; TRAP-ELF-NEXT:   xpacd x8209; TRAP-ELF-NEXT:   cmp x0, x8210; TRAP-NEXT:    b.eq [[L]]auth_success_4211; TRAP-NEXT:    brk #0xc472212; TRAP-NEXT:  Lauth_success_4:213; TRAP-DARWIN-NEXT:    mov x0, x16214; TRAP-NEXT:    ret215  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 2, i64 %arg1)216  ret i64 %tmp217}218 219define i64 @test_auth_da_zero(i64 %arg) {220; UNCHECKED-LABEL: test_auth_da_zero:221; UNCHECKED:           %bb.0:222; UNCHECKED-DARWIN-NEXT: mov x16, x0223; UNCHECKED-DARWIN-NEXT: autdza x16224; UNCHECKED-DARWIN-NEXT: mov x0, x16225; UNCHECKED-ELF-NEXT:    autdza x0226; UNCHECKED-NEXT:        ret227;228; CHECKED-LABEL: test_auth_da_zero:229; CHECKED:           %bb.0:230; CHECKED-DARWIN-NEXT: mov x16, x0231; CHECKED-DARWIN-NEXT: autdza x16232; CHECKED-DARWIN-NEXT: mov x0, x16233; CHECKED-ELF-NEXT:    autdza x0234; CHECKED-NEXT:        ret235;236; TRAP-LABEL: test_auth_da_zero:237; TRAP:       %bb.0:238; TRAP-DARWIN-NEXT:   mov x16, x0239; TRAP-DARWIN-NEXT:   autdza x16240; TRAP-DARWIN-NEXT:   mov x17, x16241; TRAP-DARWIN-NEXT:   xpacd x17242; TRAP-DARWIN-NEXT:   cmp x16, x17243; TRAP-ELF-NEXT:   autdza x0244; TRAP-ELF-NEXT:   mov x8, x0245; TRAP-ELF-NEXT:   xpacd x8246; TRAP-ELF-NEXT:   cmp x0, x8247; TRAP-NEXT:    b.eq [[L]]auth_success_5248; TRAP-NEXT:    brk #0xc472249; TRAP-NEXT:  Lauth_success_5:250; TRAP-DARWIN-NEXT:    mov x0, x16251; TRAP-NEXT:    ret252  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 2, i64 0)253  ret i64 %tmp254}255 256define i64 @test_auth_db(i64 %arg, i64 %arg1) {257; UNCHECKED-LABEL: test_auth_db:258; UNCHECKED:           %bb.0:259; UNCHECKED-DARWIN-NEXT: mov x16, x0260; UNCHECKED-DARWIN-NEXT: autdb x16, x1261; UNCHECKED-DARWIN-NEXT: mov x0, x16262; UNCHECKED-ELF-NEXT:    autdb x0, x1263; UNCHECKED-NEXT:        ret264;265; CHECKED-LABEL: test_auth_db:266; CHECKED:           %bb.0:267; CHECKED-DARWIN-NEXT: mov x16, x0268; CHECKED-DARWIN-NEXT: autdb x16, x1269; CHECKED-DARWIN-NEXT: mov x0, x16270; CHECKED-ELF-NEXT:    autdb x0, x1271; CHECKED-NEXT:        ret272;273; TRAP-LABEL: test_auth_db:274; TRAP:       %bb.0:275; TRAP-DARWIN-NEXT:   mov x16, x0276; TRAP-DARWIN-NEXT:   autdb x16, x1277; TRAP-DARWIN-NEXT:   mov x17, x16278; TRAP-DARWIN-NEXT:   xpacd x17279; TRAP-DARWIN-NEXT:   cmp x16, x17280; TRAP-ELF-NEXT:   autdb x0, x1281; TRAP-ELF-NEXT:   mov x8, x0282; TRAP-ELF-NEXT:   xpacd x8283; TRAP-ELF-NEXT:   cmp x0, x8284; TRAP-NEXT:    b.eq [[L]]auth_success_6285; TRAP-NEXT:    brk #0xc473286; TRAP-NEXT:  Lauth_success_6:287; TRAP-DARWIN-NEXT:    mov x0, x16288; TRAP-NEXT:    ret289  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 3, i64 %arg1)290  ret i64 %tmp291}292 293define i64 @test_auth_db_zero(i64 %arg) {294; UNCHECKED-LABEL: test_auth_db_zero:295; UNCHECKED:           %bb.0:296; UNCHECKED-DARWIN-NEXT: mov x16, x0297; UNCHECKED-DARWIN-NEXT: autdzb x16298; UNCHECKED-DARWIN-NEXT: mov x0, x16299; UNCHECKED-ELF-NEXT:    autdzb x0300; UNCHECKED-NEXT:        ret301;302; CHECKED-LABEL: test_auth_db_zero:303; CHECKED:           %bb.0:304; CHECKED-DARWIN-NEXT: mov x16, x0305; CHECKED-DARWIN-NEXT: autdzb x16306; CHECKED-DARWIN-NEXT: mov x0, x16307; CHECKED-ELF-NEXT:    autdzb x0308; CHECKED-NEXT:        ret309;310; TRAP-LABEL: test_auth_db_zero:311; TRAP:       %bb.0:312; TRAP-DARWIN-NEXT:   mov x16, x0313; TRAP-DARWIN-NEXT:   autdzb x16314; TRAP-DARWIN-NEXT:   mov x17, x16315; TRAP-DARWIN-NEXT:   xpacd x17316; TRAP-DARWIN-NEXT:   cmp x16, x17317; TRAP-ELF-NEXT:   autdzb x0318; TRAP-ELF-NEXT:   mov x8, x0319; TRAP-ELF-NEXT:   xpacd x8320; TRAP-ELF-NEXT:   cmp x0, x8321; TRAP-NEXT:    b.eq [[L]]auth_success_7322; TRAP-NEXT:    brk #0xc473323; TRAP-NEXT:  Lauth_success_7:324; TRAP-DARWIN-NEXT:    mov x0, x16325; TRAP-NEXT:    ret326  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 3, i64 0)327  ret i64 %tmp328}329 330;; Note that this might seem like a no-op but is actually a valid way to enforce331;; the validity of a signature.332define i64 @test_resign_ia_ia(i64 %arg, i64 %arg1, i64 %arg2) {333; UNCHECKED-LABEL: test_resign_ia_ia:334; UNCHECKED:       %bb.0:335; UNCHECKED-NEXT:    mov x16, x0336; UNCHECKED-NEXT:    autia x16, x1337; UNCHECKED-NEXT:    pacia x16, x2338; UNCHECKED-NEXT:    mov x0, x16339; UNCHECKED-NEXT:    ret340;341; CHECKED-LABEL: test_resign_ia_ia:342; CHECKED:       %bb.0:343; CHECKED-NEXT:    mov x16, x0344; CHECKED-NEXT:    autia x16, x1345; CHECKED-NEXT:    mov x17, x16346; CHECKED-NEXT:    xpaci x17347; CHECKED-NEXT:    cmp x16, x17348; CHECKED-NEXT:    b.eq [[L]]auth_success_0349; CHECKED-NEXT:    mov x16, x17350; CHECKED-NEXT:    b [[L]]resign_end_0351; CHECKED-NEXT:  Lauth_success_0:352; CHECKED-NEXT:    pacia x16, x2353; CHECKED-NEXT:  Lresign_end_0:354; CHECKED-NEXT:    mov x0, x16355; CHECKED-NEXT:    ret356;357; TRAP-LABEL: test_resign_ia_ia:358; TRAP:       %bb.0:359; TRAP-NEXT:    mov x16, x0360; TRAP-NEXT:    autia x16, x1361; TRAP-NEXT:    mov x17, x16362; TRAP-NEXT:    xpaci x17363; TRAP-NEXT:    cmp x16, x17364; TRAP-NEXT:    b.eq [[L]]auth_success_8365; TRAP-NEXT:    brk #0xc470366; TRAP-NEXT:  Lauth_success_8:367; TRAP-NEXT:    pacia x16, x2368; TRAP-NEXT:    mov x0, x16369; TRAP-NEXT:    ret370  %tmp = call i64 @llvm.ptrauth.resign(i64 %arg, i32 0, i64 %arg1, i32 0, i64 %arg2)371  ret i64 %tmp372}373 374define i64 @test_resign_ib_ia(i64 %arg, i64 %arg1, i64 %arg2) {375; UNCHECKED-LABEL: test_resign_ib_ia:376; UNCHECKED:       %bb.0:377; UNCHECKED-NEXT:    mov x16, x0378; UNCHECKED-NEXT:    autib x16, x1379; UNCHECKED-NEXT:    pacia x16, x2380; UNCHECKED-NEXT:    mov x0, x16381; UNCHECKED-NEXT:    ret382;383; CHECKED-LABEL: test_resign_ib_ia:384; CHECKED:       %bb.0:385; CHECKED-NEXT:    mov x16, x0386; CHECKED-NEXT:    autib x16, x1387; CHECKED-NEXT:    mov x17, x16388; CHECKED-NEXT:    xpaci x17389; CHECKED-NEXT:    cmp x16, x17390; CHECKED-NEXT:    b.eq [[L]]auth_success_1391; CHECKED-NEXT:    mov x16, x17392; CHECKED-NEXT:    b [[L]]resign_end_1393; CHECKED-NEXT:  Lauth_success_1:394; CHECKED-NEXT:    pacia x16, x2395; CHECKED-NEXT:  Lresign_end_1:396; CHECKED-NEXT:    mov x0, x16397; CHECKED-NEXT:    ret398;399; TRAP-LABEL: test_resign_ib_ia:400; TRAP:       %bb.0:401; TRAP-NEXT:    mov x16, x0402; TRAP-NEXT:    autib x16, x1403; TRAP-NEXT:    mov x17, x16404; TRAP-NEXT:    xpaci x17405; TRAP-NEXT:    cmp x16, x17406; TRAP-NEXT:    b.eq [[L]]auth_success_9407; TRAP-NEXT:    brk #0xc471408; TRAP-NEXT:  Lauth_success_9:409; TRAP-NEXT:    pacia x16, x2410; TRAP-NEXT:    mov x0, x16411; TRAP-NEXT:    ret412  %tmp = call i64 @llvm.ptrauth.resign(i64 %arg, i32 1, i64 %arg1, i32 0, i64 %arg2)413  ret i64 %tmp414}415 416define i64 @test_resign_da_ia(i64 %arg, i64 %arg1, i64 %arg2) {417; UNCHECKED-LABEL: test_resign_da_ia:418; UNCHECKED:       %bb.0:419; UNCHECKED-NEXT:    mov x16, x0420; UNCHECKED-NEXT:    autda x16, x1421; UNCHECKED-NEXT:    pacia x16, x2422; UNCHECKED-NEXT:    mov x0, x16423; UNCHECKED-NEXT:    ret424;425; CHECKED-LABEL: test_resign_da_ia:426; CHECKED:       %bb.0:427; CHECKED-NEXT:    mov x16, x0428; CHECKED-NEXT:    autda x16, x1429; CHECKED-NEXT:    mov x17, x16430; CHECKED-NEXT:    xpacd x17431; CHECKED-NEXT:    cmp x16, x17432; CHECKED-NEXT:    b.eq [[L]]auth_success_2433; CHECKED-NEXT:    mov x16, x17434; CHECKED-NEXT:    b [[L]]resign_end_2435; CHECKED-NEXT:  Lauth_success_2:436; CHECKED-NEXT:    pacia x16, x2437; CHECKED-NEXT:  Lresign_end_2:438; CHECKED-NEXT:    mov x0, x16439; CHECKED-NEXT:    ret440;441; TRAP-LABEL: test_resign_da_ia:442; TRAP:       %bb.0:443; TRAP-NEXT:    mov x16, x0444; TRAP-NEXT:    autda x16, x1445; TRAP-NEXT:    mov x17, x16446; TRAP-NEXT:    xpacd x17447; TRAP-NEXT:    cmp x16, x17448; TRAP-NEXT:    b.eq [[L]]auth_success_10449; TRAP-NEXT:    brk #0xc472450; TRAP-NEXT:  Lauth_success_10:451; TRAP-NEXT:    pacia x16, x2452; TRAP-NEXT:    mov x0, x16453; TRAP-NEXT:    ret454  %tmp = call i64 @llvm.ptrauth.resign(i64 %arg, i32 2, i64 %arg1, i32 0, i64 %arg2)455  ret i64 %tmp456}457 458define i64 @test_resign_db_da(i64 %arg, i64 %arg1, i64 %arg2) {459; UNCHECKED-LABEL: test_resign_db_da:460; UNCHECKED:       %bb.0:461; UNCHECKED-NEXT:    mov x16, x0462; UNCHECKED-NEXT:    autdb x16, x1463; UNCHECKED-NEXT:    pacda x16, x2464; UNCHECKED-NEXT:    mov x0, x16465; UNCHECKED-NEXT:    ret466;467; CHECKED-LABEL: test_resign_db_da:468; CHECKED:       %bb.0:469; CHECKED-NEXT:    mov x16, x0470; CHECKED-NEXT:    autdb x16, x1471; CHECKED-NEXT:    mov x17, x16472; CHECKED-NEXT:    xpacd x17473; CHECKED-NEXT:    cmp x16, x17474; CHECKED-NEXT:    b.eq [[L]]auth_success_3475; CHECKED-NEXT:    mov x16, x17476; CHECKED-NEXT:    b [[L]]resign_end_3477; CHECKED-NEXT:  Lauth_success_3:478; CHECKED-NEXT:    pacda x16, x2479; CHECKED-NEXT:  Lresign_end_3:480; CHECKED-NEXT:    mov x0, x16481; CHECKED-NEXT:    ret482;483; TRAP-LABEL: test_resign_db_da:484; TRAP:       %bb.0:485; TRAP-NEXT:    mov x16, x0486; TRAP-NEXT:    autdb x16, x1487; TRAP-NEXT:    mov x17, x16488; TRAP-NEXT:    xpacd x17489; TRAP-NEXT:    cmp x16, x17490; TRAP-NEXT:    b.eq [[L]]auth_success_11491; TRAP-NEXT:    brk #0xc473492; TRAP-NEXT:  Lauth_success_11:493; TRAP-NEXT:    pacda x16, x2494; TRAP-NEXT:    mov x0, x16495; TRAP-NEXT:    ret496  %tmp = call i64 @llvm.ptrauth.resign(i64 %arg, i32 3, i64 %arg1, i32 2, i64 %arg2)497  ret i64 %tmp498}499 500define i64 @test_resign_iza_db(i64 %arg, i64 %arg1, i64 %arg2) {501; UNCHECKED-LABEL: test_resign_iza_db:502; UNCHECKED:       %bb.0:503; UNCHECKED-NEXT:    mov x16, x0504; UNCHECKED-NEXT:    autiza x16505; UNCHECKED-NEXT:    pacdb x16, x2506; UNCHECKED-NEXT:    mov x0, x16507; UNCHECKED-NEXT:    ret508;509; CHECKED-LABEL: test_resign_iza_db:510; CHECKED:       %bb.0:511; CHECKED-NEXT:    mov x16, x0512; CHECKED-NEXT:    autiza x16513; CHECKED-NEXT:    mov x17, x16514; CHECKED-NEXT:    xpaci x17515; CHECKED-NEXT:    cmp x16, x17516; CHECKED-NEXT:    b.eq [[L]]auth_success_4517; CHECKED-NEXT:    mov x16, x17518; CHECKED-NEXT:    b [[L]]resign_end_4519; CHECKED-NEXT:  Lauth_success_4:520; CHECKED-NEXT:    pacdb x16, x2521; CHECKED-NEXT:  Lresign_end_4:522; CHECKED-NEXT:    mov x0, x16523; CHECKED-NEXT:    ret524;525; TRAP-LABEL: test_resign_iza_db:526; TRAP:       %bb.0:527; TRAP-NEXT:    mov x16, x0528; TRAP-NEXT:    autiza x16529; TRAP-NEXT:    mov x17, x16530; TRAP-NEXT:    xpaci x17531; TRAP-NEXT:    cmp x16, x17532; TRAP-NEXT:    b.eq [[L]]auth_success_12533; TRAP-NEXT:    brk #0xc470534; TRAP-NEXT:  Lauth_success_12:535; TRAP-NEXT:    pacdb x16, x2536; TRAP-NEXT:    mov x0, x16537; TRAP-NEXT:    ret538  %tmp = call i64 @llvm.ptrauth.resign(i64 %arg, i32 0, i64 0, i32 3, i64 %arg2)539  ret i64 %tmp540}541 542define i64 @test_resign_da_dzb(i64 %arg, i64 %arg1, i64 %arg2) {543; UNCHECKED-LABEL: test_resign_da_dzb:544; UNCHECKED:       %bb.0:545; UNCHECKED-NEXT:    mov x16, x0546; UNCHECKED-NEXT:    autda x16, x1547; UNCHECKED-NEXT:    pacdzb x16548; UNCHECKED-NEXT:    mov x0, x16549; UNCHECKED-NEXT:    ret550;551; CHECKED-LABEL: test_resign_da_dzb:552; CHECKED:       %bb.0:553; CHECKED-NEXT:    mov x16, x0554; CHECKED-NEXT:    autda x16, x1555; CHECKED-NEXT:    mov x17, x16556; CHECKED-NEXT:    xpacd x17557; CHECKED-NEXT:    cmp x16, x17558; CHECKED-NEXT:    b.eq [[L]]auth_success_5559; CHECKED-NEXT:    mov x16, x17560; CHECKED-NEXT:    b [[L]]resign_end_5561; CHECKED-NEXT:  Lauth_success_5:562; CHECKED-NEXT:    pacdzb x16563; CHECKED-NEXT:  Lresign_end_5:564; CHECKED-NEXT:    mov x0, x16565; CHECKED-NEXT:    ret566;567; TRAP-LABEL: test_resign_da_dzb:568; TRAP:       %bb.0:569; TRAP-NEXT:    mov x16, x0570; TRAP-NEXT:    autda x16, x1571; TRAP-NEXT:    mov x17, x16572; TRAP-NEXT:    xpacd x17573; TRAP-NEXT:    cmp x16, x17574; TRAP-NEXT:    b.eq [[L]]auth_success_13575; TRAP-NEXT:    brk #0xc472576; TRAP-NEXT:  Lauth_success_13:577; TRAP-NEXT:    pacdzb x16578; TRAP-NEXT:    mov x0, x16579; TRAP-NEXT:    ret580  %tmp = call i64 @llvm.ptrauth.resign(i64 %arg, i32 2, i64 %arg1, i32 3, i64 0)581  ret i64 %tmp582}583 584define i64 @test_auth_trap_attribute(i64 %arg, i64 %arg1) "ptrauth-auth-traps" {585; UNCHECKED-LABEL: test_auth_trap_attribute:586; UNCHECKED:     %bb.0:587; UNCHECKED-DARWIN-NEXT:  mov x16, x0588; UNCHECKED-DARWIN-NEXT:  autia x16, x1589; UNCHECKED-DARWIN-NEXT:  mov x0, x16590; UNCHECKED-ELF-NEXT:  autia x0, x1591; UNCHECKED-NEXT:  ret592;593; CHECKED-LABEL: test_auth_trap_attribute:594; CHECKED:      %bb.0:595; CHECKED-DARWIN-NEXT:   mov x16, x0596; CHECKED-DARWIN-NEXT:   autia x16, x1597; CHECKED-DARWIN-NEXT:   mov x17, x16598; CHECKED-DARWIN-NEXT:   xpaci x17599; CHECKED-DARWIN-NEXT:   cmp x16, x17600; CHECKED-ELF-NEXT:   autia x0, x1601; CHECKED-ELF-NEXT:   mov x8, x0602; CHECKED-ELF-NEXT:   xpaci x8603; CHECKED-ELF-NEXT:   cmp x0, x8604; CHECKED-NEXT:   b.eq [[L]]auth_success_6605; CHECKED-NEXT:   brk #0xc470606; CHECKED-NEXT: Lauth_success_6:607; CHECKED-DARWIN-NEXT:   mov x0, x16608; CHECKED-NEXT:   ret609;610; TRAP-LABEL: test_auth_trap_attribute:611; TRAP:       %bb.0:612; TRAP-DARWIN-NEXT:   mov x16, x0613; TRAP-DARWIN-NEXT:   autia x16, x1614; TRAP-DARWIN-NEXT:   mov x17, x16615; TRAP-DARWIN-NEXT:   xpaci x17616; TRAP-DARWIN-NEXT:   cmp x16, x17617; TRAP-ELF-NEXT:   autia x0, x1618; TRAP-ELF-NEXT:   mov x8, x0619; TRAP-ELF-NEXT:   xpaci x8620; TRAP-ELF-NEXT:   cmp x0, x8621; TRAP-NEXT:    b.eq [[L]]auth_success_14622; TRAP-NEXT:    brk #0xc470623; TRAP-NEXT:  Lauth_success_14:624; TRAP-DARWIN-NEXT:    mov x0, x16625; TRAP-NEXT:    ret626  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 0, i64 %arg1)627  ret i64 %tmp628}629 630define i64 @test_auth_ia_constdisc(i64 %arg) {631; UNCHECKED-LABEL: test_auth_ia_constdisc:632; UNCHECKED:           %bb.0:633; UNCHECKED-DARWIN-NEXT: mov x16, x0634; UNCHECKED-DARWIN-NEXT: mov x17, #256635; UNCHECKED-DARWIN-NEXT: autia x16, x17636; UNCHECKED-DARWIN-NEXT: mov x0, x16637; UNCHECKED-ELF-NEXT:    mov x8, #256638; UNCHECKED-ELF-NEXT:    autia x0, x8639; UNCHECKED-NEXT:        ret640;641; CHECKED-LABEL: test_auth_ia_constdisc:642; CHECKED:           %bb.0:643; CHECKED-DARWIN-NEXT: mov x16, x0644; CHECKED-DARWIN-NEXT: mov x17, #256645; CHECKED-DARWIN-NEXT: autia x16, x17646; CHECKED-DARWIN-NEXT: mov x0, x16647; CHECKED-ELF-NEXT:    mov x8, #256648; CHECKED-ELF-NEXT:    autia x0, x8649; CHECKED-NEXT:        ret650;651; TRAP-LABEL: test_auth_ia_constdisc:652; TRAP:       %bb.0:653; TRAP-DARWIN-NEXT:    mov x16, x0654; TRAP-DARWIN-NEXT:    mov x17, #256655; TRAP-DARWIN-NEXT:    autia x16, x17656; TRAP-DARWIN-NEXT:    mov x17, x16657; TRAP-DARWIN-NEXT:    xpaci x17658; TRAP-DARWIN-NEXT:    cmp x16, x17659; TRAP-ELF-NEXT:    mov x8, #256660; TRAP-ELF-NEXT:    autia x0, x8661; TRAP-ELF-NEXT:    mov x8, x0662; TRAP-ELF-NEXT:    xpaci x8663; TRAP-ELF-NEXT:    cmp x0, x8664; TRAP-NEXT:    b.eq [[L]]auth_success_15665; TRAP-NEXT:    brk #0xc470666; TRAP-NEXT:  Lauth_success_15:667; TRAP-DARWIN-NEXT:    mov x0, x16668; TRAP-NEXT:    ret669  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 0, i64 256)670  ret i64 %tmp671}672 673define i64 @test_resign_da_constdisc(i64 %arg, i64 %arg1) {674; UNCHECKED-LABEL: test_resign_da_constdisc:675; UNCHECKED:       %bb.0:676; UNCHECKED-NEXT:    mov x16, x0677; UNCHECKED-NEXT:    autda x16, x1678; UNCHECKED-NEXT:    mov x17, #256679; UNCHECKED-NEXT:    pacda x16, x17680; UNCHECKED-NEXT:    mov x0, x16681; UNCHECKED-NEXT:    ret682;683; CHECKED-LABEL: test_resign_da_constdisc:684; CHECKED:       %bb.0:685; CHECKED-NEXT:    mov x16, x0686; CHECKED-NEXT:    autda x16, x1687; CHECKED-NEXT:    mov x17, x16688; CHECKED-NEXT:    xpacd x17689; CHECKED-NEXT:    cmp x16, x17690; CHECKED-NEXT:    b.eq [[L]]auth_success_7691; CHECKED-NEXT:    mov x16, x17692; CHECKED-NEXT:    b [[L]]resign_end_6693; CHECKED-NEXT:  Lauth_success_7:694; CHECKED-NEXT:    mov x17, #256695; CHECKED-NEXT:    pacda x16, x17696; CHECKED-NEXT:  Lresign_end_6:697; CHECKED-NEXT:    mov x0, x16698; CHECKED-NEXT:    ret699;700; TRAP-LABEL: test_resign_da_constdisc:701; TRAP:       %bb.0:702; TRAP-NEXT:    mov x16, x0703; TRAP-NEXT:    autda x16, x1704; TRAP-NEXT:    mov x17, x16705; TRAP-NEXT:    xpacd x17706; TRAP-NEXT:    cmp x16, x17707; TRAP-NEXT:    b.eq [[L]]auth_success_16708; TRAP-NEXT:    brk #0xc472709; TRAP-NEXT:  Lauth_success_16:710; TRAP-NEXT:    mov x17, #256711; TRAP-NEXT:    pacda x16, x17712; TRAP-NEXT:    mov x0, x16713; TRAP-NEXT:    ret714  %tmp = call i64 @llvm.ptrauth.resign(i64 %arg, i32 2, i64 %arg1, i32 2, i64 256)715  ret i64 %tmp716}717 718define i64 @test_auth_ia_swapped(i64 %arg, i64 %arg1) {719; UNCHECKED-LABEL: test_auth_ia_swapped:720; UNCHECKED:           %bb.0:721; UNCHECKED-DARWIN-NEXT: mov x16, x1722; UNCHECKED-DARWIN-NEXT: autia x16, x0723; UNCHECKED-DARWIN-NEXT: mov x0, x16724; UNCHECKED-ELF-NEXT:    autia x1, x0725; UNCHECKED-ELF-NEXT:    mov x0, x1726; UNCHECKED-NEXT:        ret727;728; CHECKED-LABEL: test_auth_ia_swapped:729; CHECKED:           %bb.0:730; CHECKED-DARWIN-NEXT: mov x16, x1731; CHECKED-DARWIN-NEXT: autia x16, x0732; CHECKED-DARWIN-NEXT: mov x0, x16733; CHECKED-ELF-NEXT:    autia x1, x0734; CHECKED-ELF-NEXT:    mov x0, x1735; CHECKED-NEXT:        ret736;737; TRAP-LABEL: test_auth_ia_swapped:738; TRAP:       %bb.0:739; TRAP-DARWIN-NEXT:   mov x16, x1740; TRAP-DARWIN-NEXT:   autia x16, x0741; TRAP-DARWIN-NEXT:   mov x17, x16742; TRAP-DARWIN-NEXT:   xpaci x17743; TRAP-DARWIN-NEXT:   cmp x16, x17744; TRAP-ELF-NEXT:   autia x1, x0745; TRAP-ELF-NEXT:   mov x8, x1746; TRAP-ELF-NEXT:   xpaci x8747; TRAP-ELF-NEXT:   cmp x1, x8748; TRAP-NEXT:    b.eq [[L]]auth_success_17749; TRAP-NEXT:    brk #0xc470750; TRAP-NEXT:  Lauth_success_17:751; TRAP-DARWIN-NEXT:    mov x0, x16752; TRAP-ELF-NEXT:    mov x0, x1753; TRAP-NEXT:    ret754  %tmp = call i64 @llvm.ptrauth.auth(i64 %arg1, i32 0, i64 %arg)755  ret i64 %tmp756}757 758; Authentications should not be speculated, as they crash on failure and it is759; perfectly correct to dynamically choose the signing schema or whether to760; perform authentication at all.761define ptr @auth_speculation(i64 %signed, i1 %cond) {762; UNCHECKED-LABEL:        auth_speculation:763; UNCHECKED:                  %bb.0:764; UNCHECKED-DARWIN-NEXT:        mov     x16, x0765; UNCHECKED-DARWIN-NEXT:        tbz     w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]766; UNCHECKED-DARWIN-NEXT:      %bb.1:767; UNCHECKED-DARWIN-NEXT:        autdza  x16768; UNCHECKED-DARWIN-NEXT:        b       [[BB_RETURN:[A-Za-z0-9_.]+]]769; UNCHECKED-DARWIN-NEXT:      [[BB_ELSE]]:770; UNCHECKED-DARWIN-NEXT:        autdzb  x16771; UNCHECKED-DARWIN-NEXT:      [[BB_RETURN]]:772; UNCHECKED-DARWIN-NEXT:        ldr     x8, [x16]773; UNCHECKED-ELF-NEXT:           tbz     w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]774; UNCHECKED-ELF-NEXT:         %bb.1:775; UNCHECKED-ELF-NEXT:           autdza  x0776; UNCHECKED-ELF-NEXT:           b       [[BB_RETURN:[A-Za-z0-9_.]+]]777; UNCHECKED-ELF-NEXT:         [[BB_ELSE]]:778; UNCHECKED-ELF-NEXT:           autdzb  x0779; UNCHECKED-ELF-NEXT:         [[BB_RETURN]]:780; UNCHECKED-ELF-NEXT:           ldr     x8, [x0]781; UNCHECKED-NEXT:               ldr     x8, [x8]782; UNCHECKED-NEXT:               ldr     x8, [x8]783; UNCHECKED-NEXT:               ldr     x0, [x8]784; UNCHECKED-NEXT:               ret785;786; CHECKED-LABEL:        auth_speculation:787; CHECKED:                  %bb.0:788; CHECKED-DARWIN-NEXT:        mov     x16, x0789; CHECKED-DARWIN-NEXT:        tbz     w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]790; CHECKED-DARWIN-NEXT:      %bb.1:791; CHECKED-DARWIN-NEXT:        autdza  x16792; CHECKED-DARWIN-NEXT:        b       [[BB_RETURN:[A-Za-z0-9_.]+]]793; CHECKED-DARWIN-NEXT:      [[BB_ELSE]]:794; CHECKED-DARWIN-NEXT:        autdzb  x16795; CHECKED-DARWIN-NEXT:      [[BB_RETURN]]:796; CHECKED-DARWIN-NEXT:        ldr     x8, [x16]797; CHECKED-ELF-NEXT:           tbz     w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]798; CHECKED-ELF-NEXT:         %bb.1:799; CHECKED-ELF-NEXT:           autdza  x0800; CHECKED-ELF-NEXT:           b       [[BB_RETURN:[A-Za-z0-9_.]+]]801; CHECKED-ELF-NEXT:         [[BB_ELSE]]:802; CHECKED-ELF-NEXT:           autdzb  x0803; CHECKED-ELF-NEXT:         [[BB_RETURN]]:804; CHECKED-ELF-NEXT:           ldr     x8, [x0]805; CHECKED-NEXT:               ldr     x8, [x8]806; CHECKED-NEXT:               ldr     x8, [x8]807; CHECKED-NEXT:               ldr     x0, [x8]808; CHECKED-NEXT:               ret809;810; TRAP-LABEL:        auth_speculation:811; TRAP:                  %bb.0:812; TRAP-DARWIN-NEXT:        mov     x16, x0813; TRAP-DARWIN-NEXT:        tbz     w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]814; TRAP-DARWIN-NEXT:      %bb.1:815; TRAP-DARWIN-NEXT:        autdza  x16816; TRAP-DARWIN-NEXT:        mov     x17, x16817; TRAP-DARWIN-NEXT:        xpacd   x17818; TRAP-DARWIN-NEXT:        cmp     x16, x17819; TRAP-DARWIN-NEXT:        b.eq    [[L]]auth_success_18820; TRAP-DARWIN-NEXT:        brk     #0xc472821; TRAP-DARWIN-NEXT:      [[L]]auth_success_18:822; TRAP-DARWIN-NEXT:        b       [[BB_RETURN:[A-Za-z0-9_.]+]]823; TRAP-DARWIN-NEXT:      [[BB_ELSE]]:824; TRAP-DARWIN-NEXT:        autdzb  x16825; TRAP-DARWIN-NEXT:        mov     x17, x16826; TRAP-DARWIN-NEXT:        xpacd   x17827; TRAP-DARWIN-NEXT:        cmp     x16, x17828; TRAP-DARWIN-NEXT:        b.eq    [[L]]auth_success_19829; TRAP-DARWIN-NEXT:        brk     #0xc473830; TRAP-DARWIN-NEXT:      [[L]]auth_success_19:831; TRAP-DARWIN-NEXT:      [[BB_RETURN]]:832; TRAP-DARWIN-NEXT:        ldr     x8, [x16]833; TRAP-ELF-NEXT:           tbz     w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]834; TRAP-ELF-NEXT:         %bb.1:835; TRAP-ELF-NEXT:           autdza  x0836; TRAP-ELF-NEXT:           mov     x8, x0837; TRAP-ELF-NEXT:           xpacd   x8838; TRAP-ELF-NEXT:           cmp     x0, x8839; TRAP-ELF-NEXT:           b.eq    [[L]]auth_success_18840; TRAP-ELF-NEXT:           brk     #0xc472841; TRAP-ELF-NEXT:         [[L]]auth_success_18:842; TRAP-ELF-NEXT:           b       [[BB_RETURN:[A-Za-z0-9_.]+]]843; TRAP-ELF-NEXT:         [[BB_ELSE]]:844; TRAP-ELF-NEXT:           autdzb  x0845; TRAP-ELF-NEXT:           mov     x8, x0846; TRAP-ELF-NEXT:           xpacd   x8847; TRAP-ELF-NEXT:           cmp     x0, x8848; TRAP-ELF-NEXT:           b.eq    [[L]]auth_success_19849; TRAP-ELF-NEXT:           brk     #0xc473850; TRAP-ELF-NEXT:         [[L]]auth_success_19:851; TRAP-ELF-NEXT:         [[BB_RETURN]]:852; TRAP-ELF-NEXT:           ldr     x8, [x0]853; TRAP-NEXT:               ldr     x8, [x8]854; TRAP-NEXT:               ldr     x8, [x8]855; TRAP-NEXT:               ldr     x0, [x8]856; TRAP-NEXT:               ret857entry:858  br i1 %cond, label %if.then, label %if.else859 860if.then:861  %auted.then = tail call i64 @llvm.ptrauth.auth(i64 %signed, i32 2, i64 0)862  br label %return863 864if.else:865  %auted.else = tail call i64 @llvm.ptrauth.auth(i64 %signed, i32 3, i64 0)866  br label %return867 868return:869  %auted = phi i64 [ %auted.then, %if.then ], [ %auted.else, %if.else ]870 871  ; A sequence of instructions that is common to both "then" and "else"872  ; branches and is expensive to duplicate.873  %ptr.0 = inttoptr i64 %auted to ptr874  %ptr.1 = load ptr, ptr %ptr.0875  %ptr.2 = load ptr, ptr %ptr.1876  %ptr.3 = load ptr, ptr %ptr.2877  %ptr.4 = load ptr, ptr %ptr.3878  ret ptr %ptr.4879}880 881declare i64 @llvm.ptrauth.auth(i64, i32, i64)882declare i64 @llvm.ptrauth.resign(i64, i32, i64, i32, i64)883