1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2
2
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
3
4
+ define 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 i64
10
+ %v1 = call i64 @llvm.ptrauth.sign (i64 %v0 , i32 2 , i64 5678 )
11
+ %v2 = inttoptr i64 %v1 to ptr
12
+ %v3 = call i32 %v2 () [ "ptrauth" (i32 2 , i64 5678 ) ]
13
+ ret i32 %v3
14
+ }
15
+
16
+ define 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 i64
22
+ %v1 = call i64 @llvm.ptrauth.sign (i64 %v0 , i32 2 , i64 5678 )
23
+ %v2 = inttoptr i64 %v1 to ptr
24
+ %v3 = call i32 %v2 () [ "somebundle" (ptr null ), "ptrauth" (i32 2 , i64 5678 ), "otherbundle" (i64 0 ) ]
25
+ ret i32 %v3
26
+ }
27
+
4
28
define i32 @test_ptrauth_call_resign (ptr %p ) {
5
29
; CHECK-LABEL: @test_ptrauth_call_resign(
6
- ; CHECK-NEXT: [[TMP3 :%.*]] = call i32 [[P:%.*]]() [ "ptrauth"(i32 0 , i64 1234) ]
7
- ; CHECK-NEXT: ret i32 [[TMP3 ]]
30
+ ; CHECK-NEXT: [[V3 :%.*]] = call i32 [[P:%.*]]() [ "ptrauth"(i32 1 , i64 1234) ]
31
+ ; CHECK-NEXT: ret i32 [[V3 ]]
8
32
;
9
- %tmp0 = ptrtoint ptr %p to i64
10
- %tmp1 = call i64 @llvm.ptrauth.resign (i64 %tmp0 , i32 0 , i64 1234 , i32 2 , i64 5678 )
11
- %tmp2 = inttoptr i64 %tmp1 to ptr
12
- %tmp3 = call i32 %tmp2 () [ "ptrauth" (i32 2 , i64 5678 ) ]
13
- ret i32 %tmp3
33
+ %v0 = ptrtoint ptr %p to i64
34
+ %v1 = call i64 @llvm.ptrauth.resign (i64 %v0 , i32 1 , i64 1234 , i32 1 , i64 5678 )
35
+ %v2 = inttoptr i64 %v1 to ptr
36
+ %v3 = call i32 %v2 () [ "ptrauth" (i32 1 , i64 5678 ) ]
37
+ ret i32 %v3
14
38
}
15
39
16
40
define i32 @test_ptrauth_call_resign_blend (ptr %pp ) {
17
41
; CHECK-LABEL: @test_ptrauth_call_resign_blend(
18
- ; CHECK-NEXT: [[TMP01 :%.*]] = load ptr, ptr [[PP:%.*]], align 8
19
- ; CHECK-NEXT: [[TMP6 :%.*]] = call i32 [[TMP01 ]]() [ "ptrauth"(i32 0 , i64 1234) ]
20
- ; CHECK-NEXT: ret i32 [[TMP6 ]]
42
+ ; CHECK-NEXT: [[V01 :%.*]] = load ptr, ptr [[PP:%.*]], align 8
43
+ ; CHECK-NEXT: [[V6 :%.*]] = call i32 [[V01 ]]() [ "ptrauth"(i32 1 , i64 1234) ]
44
+ ; CHECK-NEXT: ret i32 [[V6 ]]
21
45
;
22
- %tmp0 = load ptr , ptr %pp , align 8
23
- %tmp1 = ptrtoint ptr %pp to i64
24
- %tmp2 = ptrtoint ptr %tmp0 to i64
25
- %tmp3 = call i64 @llvm.ptrauth.blend (i64 %tmp1 , i64 5678 )
26
- %tmp4 = call i64 @llvm.ptrauth.resign (i64 %tmp2 , i32 0 , i64 1234 , i32 1 , i64 %tmp3 )
27
- %tmp5 = inttoptr i64 %tmp4 to ptr
28
- %tmp6 = call i32 %tmp5 () [ "ptrauth" (i32 1 , i64 %tmp3 ) ]
29
- ret i32 %tmp6
46
+ %v0 = load ptr , ptr %pp , align 8
47
+ %v1 = ptrtoint ptr %pp to i64
48
+ %v2 = ptrtoint ptr %v0 to i64
49
+ %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 ptr
52
+ %v6 = call i32 %v5 () [ "ptrauth" (i32 1 , i64 %v3 ) ]
53
+ ret i32 %v6
30
54
}
31
55
32
56
define i32 @test_ptrauth_call_resign_blend_2 (ptr %pp ) {
33
57
; CHECK-LABEL: @test_ptrauth_call_resign_blend_2(
34
- ; CHECK-NEXT: [[TMP01:%.*]] = load ptr, ptr [[PP:%.*]], align 8
35
- ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PP]] to i64
36
- ; CHECK-NEXT: [[TMP3:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[TMP1]], i64 5678)
37
- ; CHECK-NEXT: [[TMP6:%.*]] = call i32 [[TMP01]]() [ "ptrauth"(i32 1, i64 [[TMP3]]) ]
38
- ; CHECK-NEXT: ret i32 [[TMP6]]
58
+ ; CHECK-NEXT: [[V01:%.*]] = load ptr, ptr [[PP:%.*]], align 8
59
+ ; CHECK-NEXT: [[V1:%.*]] = ptrtoint ptr [[PP]] to i64
60
+ ; 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 8
65
+ %v1 = ptrtoint ptr %pp to i64
66
+ %v2 = ptrtoint ptr %v0 to i64
67
+ %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 ptr
70
+ %v6 = call i32 %v5 () [ "ptrauth" (i32 0 , i64 1234 ) ]
71
+ ret i32 %v6
72
+ }
73
+
74
+ define 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 i64
77
+ ; 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 ptr
79
+ ; CHECK-NEXT: [[V3:%.*]] = call i32 [[V2]]() [ "ptrauth"(i32 1, i64 5678) ]
80
+ ; CHECK-NEXT: ret i32 [[V3]]
81
+ ;
82
+ %v0 = ptrtoint ptr %p to i64
83
+ %v1 = call i64 @llvm.ptrauth.resign (i64 %v0 , i32 1 , i64 1234 , i32 0 , i64 5678 )
84
+ %v2 = inttoptr i64 %v1 to ptr
85
+ %v3 = call i32 %v2 () [ "ptrauth" (i32 1 , i64 5678 ) ]
86
+ ret i32 %v3
87
+ }
88
+
89
+ define 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 i64
92
+ ; 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 ptr
94
+ ; CHECK-NEXT: [[V3:%.*]] = call i32 [[V2]]() [ "ptrauth"(i32 1, i64 5678) ]
95
+ ; CHECK-NEXT: ret i32 [[V3]]
39
96
;
40
- %tmp0 = load ptr , ptr %pp , align 8
41
- %tmp1 = ptrtoint ptr %pp to i64
42
- %tmp2 = ptrtoint ptr %tmp0 to i64
43
- %tmp3 = call i64 @llvm.ptrauth.blend (i64 %tmp1 , i64 5678 )
44
- %tmp4 = call i64 @llvm.ptrauth.resign (i64 %tmp2 , i32 1 , i64 %tmp3 , i32 0 , i64 1234 )
45
- %tmp5 = inttoptr i64 %tmp4 to ptr
46
- %tmp6 = call i32 %tmp5 () [ "ptrauth" (i32 0 , i64 1234 ) ]
47
- ret i32 %tmp6
97
+ %v0 = ptrtoint ptr %p to i64
98
+ %v1 = call i64 @llvm.ptrauth.resign (i64 %v0 , i32 1 , i64 1234 , i32 0 , i64 9900 )
99
+ %v2 = inttoptr i64 %v1 to ptr
100
+ %v3 = call i32 %v2 () [ "ptrauth" (i32 1 , i64 5678 ) ]
101
+ ret i32 %v3
48
102
}
49
103
104
+ define 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 8
107
+ ; CHECK-NEXT: [[V1:%.*]] = ptrtoint ptr [[PP]] to i64
108
+ ; CHECK-NEXT: [[V2:%.*]] = ptrtoint ptr [[V0]] to i64
109
+ ; 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 ptr
112
+ ; 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 8
116
+ %v1 = ptrtoint ptr %pp to i64
117
+ %v2 = ptrtoint ptr %v0 to i64
118
+ %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 ptr
121
+ %v6 = call i32 %v5 () [ "ptrauth" (i32 1 , i64 %v1 ) ]
122
+ ret i32 %v6
123
+ }
124
+
125
+ ; Downstream, we allow changing keys
126
+
127
+ define i32 @test_ptrauth_call_resign_changing_call_key (ptr %p ) {
128
+ ; CHECK-LABEL: @test_ptrauth_call_resign_changing_call_key(
129
+ ; CHECK-NEXT: [[V3:%.*]] = call i32 [[P:%.*]]() [ "ptrauth"(i32 0, i64 1234) ]
130
+ ; CHECK-NEXT: ret i32 [[V3]]
131
+ ;
132
+ %v0 = ptrtoint ptr %p to i64
133
+ %v1 = call i64 @llvm.ptrauth.resign (i64 %v0 , i32 0 , i64 1234 , i32 1 , i64 5678 )
134
+ %v2 = inttoptr i64 %v1 to ptr
135
+ %v3 = call i32 %v2 () [ "ptrauth" (i32 1 , i64 5678 ) ]
136
+ ret i32 %v3
137
+ }
138
+
139
+ ; Downstream, we fold auth into the call
140
+
50
141
define i32 @test_ptrauth_call_auth (ptr %p ) {
51
142
; CHECK-LABEL: @test_ptrauth_call_auth(
52
143
; CHECK-NEXT: [[TMP3:%.*]] = call i32 [[P:%.*]]() [ "ptrauth"(i32 2, i64 5678) ]
@@ -59,19 +150,6 @@ define i32 @test_ptrauth_call_auth(ptr %p) {
59
150
ret i32 %tmp3
60
151
}
61
152
62
- define i32 @test_ptrauth_call_sign (ptr %p ) {
63
- ; CHECK-LABEL: @test_ptrauth_call_sign(
64
- ; CHECK-NEXT: [[TMP3:%.*]] = call i32 [[P:%.*]]()
65
- ; CHECK-NEXT: ret i32 [[TMP3]]
66
- ;
67
- %tmp0 = ptrtoint ptr %p to i64
68
- %tmp1 = call i64 @llvm.ptrauth.sign (i64 %tmp0 , i32 2 , i64 5678 )
69
- %tmp2 = inttoptr i64 %tmp1 to ptr
70
- %tmp3 = call i32 %tmp2 () [ "ptrauth" (i32 2 , i64 5678 ) ]
71
- ret i32 %tmp3
72
- }
73
-
74
- declare i64 @llvm.ptrauth.auth (i64 , i32 , i64 )
75
153
declare i64 @llvm.ptrauth.sign (i64 , i32 , i64 )
76
154
declare i64 @llvm.ptrauth.resign (i64 , i32 , i64 , i32 , i64 )
77
155
declare i64 @llvm.ptrauth.blend (i64 , i64 )
0 commit comments