305 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_blend(i64 %arg, i64 %arg1) {35; UNCHECKED-LABEL: test_auth_blend:36; UNCHECKED: %bb.0:37; UNCHECKED-DARWIN-NEXT: mov x16, x038; UNCHECKED-DARWIN-NEXT: mov x17, x139; UNCHECKED-DARWIN-NEXT: movk x17, #65535, lsl #4840; UNCHECKED-DARWIN-NEXT: autda x16, x1741; UNCHECKED-DARWIN-NEXT: mov x0, x1642; UNCHECKED-ELF-NEXT: movk x1, #65535, lsl #4843; UNCHECKED-ELF-NEXT: autda x0, x144; UNCHECKED-NEXT: ret45;46; CHECKED-LABEL: test_auth_blend:47; CHECKED: %bb.0:48; CHECKED-DARWIN-NEXT: mov x16, x049; CHECKED-DARWIN-NEXT: mov x17, x150; CHECKED-DARWIN-NEXT: movk x17, #65535, lsl #4851; CHECKED-DARWIN-NEXT: autda x16, x1752; CHECKED-DARWIN-NEXT: mov x0, x1653; CHECKED-ELF-NEXT: movk x1, #65535, lsl #4854; CHECKED-ELF-NEXT: autda x0, x155; CHECKED-NEXT: ret56;57; TRAP-LABEL: test_auth_blend:58; TRAP: %bb.0:59; TRAP-DARWIN-NEXT: mov x16, x060; TRAP-DARWIN-NEXT: mov x17, x161; TRAP-DARWIN-NEXT: movk x17, #65535, lsl #4862; TRAP-DARWIN-NEXT: autda x16, x1763; TRAP-DARWIN-NEXT: mov x17, x1664; TRAP-DARWIN-NEXT: xpacd x1765; TRAP-DARWIN-NEXT: cmp x16, x1766; TRAP-ELF-NEXT: movk x1, #65535, lsl #4867; TRAP-ELF-NEXT: autda x0, x168; TRAP-ELF-NEXT: mov x8, x069; TRAP-ELF-NEXT: xpacd x870; TRAP-ELF-NEXT: cmp x0, x871; TRAP-NEXT: b.eq [[L]]auth_success_072; TRAP-NEXT: brk #0xc47273; TRAP-NEXT: Lauth_success_0:74; TRAP-DARWIN-NEXT: mov x0, x1675; TRAP-NEXT: ret76 %tmp0 = call i64 @llvm.ptrauth.blend(i64 %arg1, i64 65535)77 %tmp1 = call i64 @llvm.ptrauth.auth(i64 %arg, i32 2, i64 %tmp0)78 ret i64 %tmp179}80 81define i64 @test_resign_blend(i64 %arg, i64 %arg1, i64 %arg2) {82; UNCHECKED-LABEL: test_resign_blend:83; UNCHECKED: %bb.0:84; UNCHECKED-NEXT: mov x16, x085; UNCHECKED-ELF-NEXT: movk x1, #12345, lsl #4886; UNCHECKED-ELF-NEXT: autda x16, x187; UNCHECKED-DARWIN-NEXT: mov x17, x188; UNCHECKED-DARWIN-NEXT: movk x17, #12345, lsl #4889; UNCHECKED-DARWIN-NEXT: autda x16, x1790; UNCHECKED-NEXT: mov x17, x291; UNCHECKED-NEXT: movk x17, #56789, lsl #4892; UNCHECKED-NEXT: pacdb x16, x1793; UNCHECKED-NEXT: mov x0, x1694; UNCHECKED-NEXT: ret95;96; CHECKED-LABEL: test_resign_blend:97; CHECKED: %bb.0:98; CHECKED-NEXT: mov x16, x099; CHECKED-ELF-NEXT: movk x1, #12345, lsl #48100; CHECKED-ELF-NEXT: autda x16, x1101; CHECKED-DARWIN-NEXT: mov x17, x1102; CHECKED-DARWIN-NEXT: movk x17, #12345, lsl #48103; CHECKED-DARWIN-NEXT: autda x16, x17104; CHECKED-NEXT: mov x17, x16105; CHECKED-NEXT: xpacd x17106; CHECKED-NEXT: cmp x16, x17107; CHECKED-NEXT: b.eq [[L]]auth_success_0108; CHECKED-NEXT: mov x16, x17109; CHECKED-NEXT: b [[L]]resign_end_0110; CHECKED-NEXT: Lauth_success_0:111; CHECKED-NEXT: mov x17, x2112; CHECKED-NEXT: movk x17, #56789, lsl #48113; CHECKED-NEXT: pacdb x16, x17114; CHECKED-NEXT: Lresign_end_0:115; CHECKED-NEXT: mov x0, x16116; CHECKED-NEXT: ret117;118; TRAP-LABEL: test_resign_blend:119; TRAP: %bb.0:120; TRAP-NEXT: mov x16, x0121; TRAP-ELF-NEXT: movk x1, #12345, lsl #48122; TRAP-ELF-NEXT: autda x16, x1123; TRAP-DARWIN-NEXT: mov x17, x1124; TRAP-DARWIN-NEXT: movk x17, #12345, lsl #48125; TRAP-DARWIN-NEXT: autda x16, x17126; TRAP-NEXT: mov x17, x16127; TRAP-NEXT: xpacd x17128; TRAP-NEXT: cmp x16, x17129; TRAP-NEXT: b.eq [[L]]auth_success_1130; TRAP-NEXT: brk #0xc472131; TRAP-NEXT: Lauth_success_1:132; TRAP-NEXT: mov x17, x2133; TRAP-NEXT: movk x17, #56789, lsl #48134; TRAP-NEXT: pacdb x16, x17135; TRAP-NEXT: mov x0, x16136; TRAP-NEXT: ret137 %tmp0 = call i64 @llvm.ptrauth.blend(i64 %arg1, i64 12345)138 %tmp1 = call i64 @llvm.ptrauth.blend(i64 %arg2, i64 56789)139 %tmp2 = call i64 @llvm.ptrauth.resign(i64 %arg, i32 2, i64 %tmp0, i32 3, i64 %tmp1)140 ret i64 %tmp2141}142 143define i64 @test_resign_blend_and_const(i64 %arg, i64 %arg1) {144; UNCHECKED-LABEL: test_resign_blend_and_const:145; UNCHECKED: %bb.0:146; UNCHECKED-NEXT: mov x16, x0147; UNCHECKED-ELF-NEXT: movk x1, #12345, lsl #48148; UNCHECKED-ELF-NEXT: autda x16, x1149; UNCHECKED-DARWIN-NEXT: mov x17, x1150; UNCHECKED-DARWIN-NEXT: movk x17, #12345, lsl #48151; UNCHECKED-DARWIN-NEXT: autda x16, x17152; UNCHECKED-NEXT: mov x17, #56789153; UNCHECKED-NEXT: pacdb x16, x17154; UNCHECKED-NEXT: mov x0, x16155; UNCHECKED-NEXT: ret156;157; CHECKED-LABEL: test_resign_blend_and_const:158; CHECKED: %bb.0:159; CHECKED-NEXT: mov x16, x0160; CHECKED-ELF-NEXT: movk x1, #12345, lsl #48161; CHECKED-ELF-NEXT: autda x16, x1162; CHECKED-DARWIN-NEXT: mov x17, x1163; CHECKED-DARWIN-NEXT: movk x17, #12345, lsl #48164; CHECKED-DARWIN-NEXT: autda x16, x17165; CHECKED-NEXT: mov x17, x16166; CHECKED-NEXT: xpacd x17167; CHECKED-NEXT: cmp x16, x17168; CHECKED-NEXT: b.eq [[L]]auth_success_1169; CHECKED-NEXT: mov x16, x17170; CHECKED-NEXT: b [[L]]resign_end_1171; CHECKED-NEXT: Lauth_success_1:172; CHECKED-NEXT: mov x17, #56789173; CHECKED-NEXT: pacdb x16, x17174; CHECKED-NEXT: Lresign_end_1:175; CHECKED-NEXT: mov x0, x16176; CHECKED-NEXT: ret177;178; TRAP-LABEL: test_resign_blend_and_const:179; TRAP: %bb.0:180; TRAP-NEXT: mov x16, x0181; TRAP-ELF-NEXT: movk x1, #12345, lsl #48182; TRAP-ELF-NEXT: autda x16, x1183; TRAP-DARWIN-NEXT: mov x17, x1184; TRAP-DARWIN-NEXT: movk x17, #12345, lsl #48185; TRAP-DARWIN-NEXT: autda x16, x17186; TRAP-NEXT: mov x17, x16187; TRAP-NEXT: xpacd x17188; TRAP-NEXT: cmp x16, x17189; TRAP-NEXT: b.eq [[L]]auth_success_2190; TRAP-NEXT: brk #0xc472191; TRAP-NEXT: Lauth_success_2:192; TRAP-NEXT: mov x17, #56789193; TRAP-NEXT: pacdb x16, x17194; TRAP-NEXT: mov x0, x16195; TRAP-NEXT: ret196 %tmp0 = call i64 @llvm.ptrauth.blend(i64 %arg1, i64 12345)197 %tmp1 = call i64 @llvm.ptrauth.resign(i64 %arg, i32 2, i64 %tmp0, i32 3, i64 56789)198 ret i64 %tmp1199}200 201define i64 @test_resign_blend_and_addr(i64 %arg, i64 %arg1, i64 %arg2) {202; UNCHECKED-LABEL: test_resign_blend_and_addr:203; UNCHECKED: %bb.0:204; UNCHECKED-NEXT: mov x16, x0205; UNCHECKED-ELF-NEXT: movk x1, #12345, lsl #48206; UNCHECKED-ELF-NEXT: autda x16, x1207; UNCHECKED-DARWIN-NEXT: mov x17, x1208; UNCHECKED-DARWIN-NEXT: movk x17, #12345, lsl #48209; UNCHECKED-DARWIN-NEXT: autda x16, x17210; UNCHECKED-NEXT: pacdb x16, x2211; UNCHECKED-NEXT: mov x0, x16212; UNCHECKED-NEXT: ret213;214; CHECKED-LABEL: test_resign_blend_and_addr:215; CHECKED: %bb.0:216; CHECKED-NEXT: mov x16, x0217; CHECKED-ELF-NEXT: movk x1, #12345, lsl #48218; CHECKED-ELF-NEXT: autda x16, x1219; CHECKED-DARWIN-NEXT: mov x17, x1220; CHECKED-DARWIN-NEXT: movk x17, #12345, lsl #48221; CHECKED-DARWIN-NEXT: autda x16, x17222; CHECKED-NEXT: mov x17, x16223; CHECKED-NEXT: xpacd x17224; CHECKED-NEXT: cmp x16, x17225; CHECKED-NEXT: b.eq [[L]]auth_success_2226; CHECKED-NEXT: mov x16, x17227; CHECKED-NEXT: b [[L]]resign_end_2228; CHECKED-NEXT: Lauth_success_2:229; CHECKED-NEXT: pacdb x16, x2230; CHECKED-NEXT: Lresign_end_2:231; CHECKED-NEXT: mov x0, x16232; CHECKED-NEXT: ret233;234; TRAP-LABEL: test_resign_blend_and_addr:235; TRAP: %bb.0:236; TRAP-NEXT: mov x16, x0237; TRAP-ELF-NEXT: movk x1, #12345, lsl #48238; TRAP-ELF-NEXT: autda x16, x1239; TRAP-DARWIN-NEXT: mov x17, x1240; TRAP-DARWIN-NEXT: movk x17, #12345, lsl #48241; TRAP-DARWIN-NEXT: autda x16, x17242; TRAP-NEXT: mov x17, x16243; TRAP-NEXT: xpacd x17244; TRAP-NEXT: cmp x16, x17245; TRAP-NEXT: b.eq [[L]]auth_success_3246; TRAP-NEXT: brk #0xc472247; TRAP-NEXT: Lauth_success_3:248; TRAP-NEXT: pacdb x16, x2249; TRAP-NEXT: mov x0, x16250; TRAP-NEXT: ret251 %tmp0 = call i64 @llvm.ptrauth.blend(i64 %arg1, i64 12345)252 %tmp1 = call i64 @llvm.ptrauth.resign(i64 %arg, i32 2, i64 %tmp0, i32 3, i64 %arg2)253 ret i64 %tmp1254}255 256define i64 @test_auth_too_large_discriminator(i64 %arg, i64 %arg1) {257; UNCHECKED-LABEL: test_auth_too_large_discriminator:258; UNCHECKED: %bb.0:259; UNCHECKED-NEXT: mov w8, #65536260; UNCHECKED-DARWIN-NEXT: bfi x1, x8, #48, #16261; UNCHECKED-DARWIN-NEXT: mov x16, x0262; UNCHECKED-DARWIN-NEXT: autda x16, x1263; UNCHECKED-DARWIN-NEXT: mov x0, x16264; UNCHECKED-ELF-NEXT: bfi x1, x8, #48, #16265; UNCHECKED-ELF-NEXT: autda x0, x1266; UNCHECKED-NEXT: ret267;268; CHECKED-LABEL: test_auth_too_large_discriminator:269; CHECKED: %bb.0:270; CHECKED-NEXT: mov w8, #65536271; CHECKED-DARWIN-NEXT: bfi x1, x8, #48, #16272; CHECKED-DARWIN-NEXT: mov x16, x0273; CHECKED-DARWIN-NEXT: autda x16, x1274; CHECKED-DARWIN-NEXT: mov x0, x16275; CHECKED-ELF-NEXT: bfi x1, x8, #48, #16276; CHECKED-ELF-NEXT: autda x0, x1277; CHECKED-NEXT: ret278;279; TRAP-LABEL: test_auth_too_large_discriminator:280; TRAP: %bb.0:281; TRAP-NEXT: mov w8, #65536282; TRAP-NEXT: bfi x1, x8, #48, #16283; TRAP-DARWIN-NEXT: mov x16, x0284; TRAP-DARWIN-NEXT: autda x16, x1285; TRAP-DARWIN-NEXT: mov x17, x16286; TRAP-DARWIN-NEXT: xpacd x17287; TRAP-DARWIN-NEXT: cmp x16, x17288; TRAP-ELF-NEXT: autda x0, x1289; TRAP-ELF-NEXT: mov x8, x0290; TRAP-ELF-NEXT: xpacd x8291; TRAP-ELF-NEXT: cmp x0, x8292; TRAP-NEXT: b.eq [[L]]auth_success_4293; TRAP-NEXT: brk #0xc472294; TRAP-NEXT: Lauth_success_4:295; TRAP-DARWIN-NEXT: mov x0, x16296; TRAP-NEXT: ret297 %tmp0 = call i64 @llvm.ptrauth.blend(i64 %arg1, i64 65536)298 %tmp1 = call i64 @llvm.ptrauth.auth(i64 %arg, i32 2, i64 %tmp0)299 ret i64 %tmp1300}301 302declare i64 @llvm.ptrauth.auth(i64, i32, i64)303declare i64 @llvm.ptrauth.resign(i64, i32, i64, i32, i64)304declare i64 @llvm.ptrauth.blend(i64, i64)305