143 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i32 @test_ptrauth_call_sign(ptr %p) {5; CHECK-LABEL: @test_ptrauth_call_sign(6; CHECK-NEXT: [[V3:%.*]] = call i32 [[P:%.*]]()7; CHECK-NEXT: ret i32 [[V3]]8;9 %v0 = ptrtoint ptr %p to i6410 %v1 = call i64 @llvm.ptrauth.sign(i64 %v0, i32 2, i64 5678)11 %v2 = inttoptr i64 %v1 to ptr12 %v3 = call i32 %v2() [ "ptrauth"(i32 2, i64 5678) ]13 ret i32 %v314}15 16define i32 @test_ptrauth_call_sign_otherbundle(ptr %p) {17; CHECK-LABEL: @test_ptrauth_call_sign_otherbundle(18; CHECK-NEXT: [[V3:%.*]] = call i32 [[P:%.*]]() [ "somebundle"(ptr null), "otherbundle"(i64 0) ]19; CHECK-NEXT: ret i32 [[V3]]20;21 %v0 = ptrtoint ptr %p to i6422 %v1 = call i64 @llvm.ptrauth.sign(i64 %v0, i32 2, i64 5678)23 %v2 = inttoptr i64 %v1 to ptr24 %v3 = call i32 %v2() [ "somebundle"(ptr null), "ptrauth"(i32 2, i64 5678), "otherbundle"(i64 0) ]25 ret i32 %v326}27 28define i32 @test_ptrauth_call_resign(ptr %p) {29; CHECK-LABEL: @test_ptrauth_call_resign(30; CHECK-NEXT: [[V3:%.*]] = call i32 [[P:%.*]]() [ "ptrauth"(i32 1, i64 1234) ]31; CHECK-NEXT: ret i32 [[V3]]32;33 %v0 = ptrtoint ptr %p to i6434 %v1 = call i64 @llvm.ptrauth.resign(i64 %v0, i32 1, i64 1234, i32 1, i64 5678)35 %v2 = inttoptr i64 %v1 to ptr36 %v3 = call i32 %v2() [ "ptrauth"(i32 1, i64 5678) ]37 ret i32 %v338}39 40define i32 @test_ptrauth_call_resign_blend(ptr %pp) {41; CHECK-LABEL: @test_ptrauth_call_resign_blend(42; CHECK-NEXT: [[V01:%.*]] = load ptr, ptr [[PP:%.*]], align 843; CHECK-NEXT: [[V6:%.*]] = call i32 [[V01]]() [ "ptrauth"(i32 1, i64 1234) ]44; CHECK-NEXT: ret i32 [[V6]]45;46 %v0 = load ptr, ptr %pp, align 847 %v1 = ptrtoint ptr %pp to i6448 %v2 = ptrtoint ptr %v0 to i6449 %v3 = call i64 @llvm.ptrauth.blend(i64 %v1, i64 5678)50 %v4 = call i64 @llvm.ptrauth.resign(i64 %v2, i32 1, i64 1234, i32 1, i64 %v3)51 %v5 = inttoptr i64 %v4 to ptr52 %v6 = call i32 %v5() [ "ptrauth"(i32 1, i64 %v3) ]53 ret i32 %v654}55 56define i32 @test_ptrauth_call_resign_blend_2(ptr %pp) {57; CHECK-LABEL: @test_ptrauth_call_resign_blend_2(58; CHECK-NEXT: [[V01:%.*]] = load ptr, ptr [[PP:%.*]], align 859; CHECK-NEXT: [[V1:%.*]] = ptrtoint ptr [[PP]] to i6460; CHECK-NEXT: [[V3:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[V1]], i64 5678)61; CHECK-NEXT: [[V6:%.*]] = call i32 [[V01]]() [ "ptrauth"(i32 0, i64 [[V3]]) ]62; CHECK-NEXT: ret i32 [[V6]]63;64 %v0 = load ptr, ptr %pp, align 865 %v1 = ptrtoint ptr %pp to i6466 %v2 = ptrtoint ptr %v0 to i6467 %v3 = call i64 @llvm.ptrauth.blend(i64 %v1, i64 5678)68 %v4 = call i64 @llvm.ptrauth.resign(i64 %v2, i32 0, i64 %v3, i32 0, i64 1234)69 %v5 = inttoptr i64 %v4 to ptr70 %v6 = call i32 %v5() [ "ptrauth"(i32 0, i64 1234) ]71 ret i32 %v672}73 74define i32 @test_ptrauth_call_resign_mismatch_key(ptr %p) {75; CHECK-LABEL: @test_ptrauth_call_resign_mismatch_key(76; CHECK-NEXT: [[V0:%.*]] = ptrtoint ptr [[P:%.*]] to i6477; CHECK-NEXT: [[V1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[V0]], i32 1, i64 1234, i32 0, i64 5678)78; CHECK-NEXT: [[V2:%.*]] = inttoptr i64 [[V1]] to ptr79; CHECK-NEXT: [[V3:%.*]] = call i32 [[V2]]() [ "ptrauth"(i32 1, i64 5678) ]80; CHECK-NEXT: ret i32 [[V3]]81;82 %v0 = ptrtoint ptr %p to i6483 %v1 = call i64 @llvm.ptrauth.resign(i64 %v0, i32 1, i64 1234, i32 0, i64 5678)84 %v2 = inttoptr i64 %v1 to ptr85 %v3 = call i32 %v2() [ "ptrauth"(i32 1, i64 5678) ]86 ret i32 %v387}88 89define i32 @test_ptrauth_call_resign_mismatch_disc(ptr %p) {90; CHECK-LABEL: @test_ptrauth_call_resign_mismatch_disc(91; CHECK-NEXT: [[V0:%.*]] = ptrtoint ptr [[P:%.*]] to i6492; CHECK-NEXT: [[V1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[V0]], i32 1, i64 1234, i32 0, i64 9900)93; CHECK-NEXT: [[V2:%.*]] = inttoptr i64 [[V1]] to ptr94; CHECK-NEXT: [[V3:%.*]] = call i32 [[V2]]() [ "ptrauth"(i32 1, i64 5678) ]95; CHECK-NEXT: ret i32 [[V3]]96;97 %v0 = ptrtoint ptr %p to i6498 %v1 = call i64 @llvm.ptrauth.resign(i64 %v0, i32 1, i64 1234, i32 0, i64 9900)99 %v2 = inttoptr i64 %v1 to ptr100 %v3 = call i32 %v2() [ "ptrauth"(i32 1, i64 5678) ]101 ret i32 %v3102}103 104define i32 @test_ptrauth_call_resign_mismatch_blend(ptr %pp) {105; CHECK-LABEL: @test_ptrauth_call_resign_mismatch_blend(106; CHECK-NEXT: [[V0:%.*]] = load ptr, ptr [[PP:%.*]], align 8107; CHECK-NEXT: [[V1:%.*]] = ptrtoint ptr [[PP]] to i64108; CHECK-NEXT: [[V2:%.*]] = ptrtoint ptr [[V0]] to i64109; CHECK-NEXT: [[V6:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[V1]], i64 5678)110; CHECK-NEXT: [[V4:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[V2]], i32 1, i64 1234, i32 1, i64 [[V6]])111; CHECK-NEXT: [[V5:%.*]] = inttoptr i64 [[V4]] to ptr112; CHECK-NEXT: [[V3:%.*]] = call i32 [[V5]]() [ "ptrauth"(i32 1, i64 [[V1]]) ]113; CHECK-NEXT: ret i32 [[V3]]114;115 %v0 = load ptr, ptr %pp, align 8116 %v1 = ptrtoint ptr %pp to i64117 %v2 = ptrtoint ptr %v0 to i64118 %v3 = call i64 @llvm.ptrauth.blend(i64 %v1, i64 5678)119 %v4 = call i64 @llvm.ptrauth.resign(i64 %v2, i32 1, i64 1234, i32 1, i64 %v3)120 %v5 = inttoptr i64 %v4 to ptr121 %v6 = call i32 %v5() [ "ptrauth"(i32 1, i64 %v1) ]122 ret i32 %v6123}124 125define i32 @test_ptrauth_call_resign_changing_call_key(ptr %p) {126; CHECK-LABEL: @test_ptrauth_call_resign_changing_call_key(127; CHECK-NEXT: [[V0:%.*]] = ptrtoint ptr [[P:%.*]] to i64128; CHECK-NEXT: [[V1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[V0]], i32 2, i64 1234, i32 1, i64 5678)129; CHECK-NEXT: [[V2:%.*]] = inttoptr i64 [[V1]] to ptr130; CHECK-NEXT: [[V3:%.*]] = call i32 [[V2]]() [ "ptrauth"(i32 1, i64 5678) ]131; CHECK-NEXT: ret i32 [[V3]]132;133 %v0 = ptrtoint ptr %p to i64134 %v1 = call i64 @llvm.ptrauth.resign(i64 %v0, i32 2, i64 1234, i32 1, i64 5678)135 %v2 = inttoptr i64 %v1 to ptr136 %v3 = call i32 %v2() [ "ptrauth"(i32 1, i64 5678) ]137 ret i32 %v3138}139 140declare i64 @llvm.ptrauth.sign(i64, i32, i64)141declare i64 @llvm.ptrauth.resign(i64, i32, i64, i32, i64)142declare i64 @llvm.ptrauth.blend(i64, i64)143