@@ -24,11 +24,7 @@ define void @test_simple(i1 %cond, ptr %storage1, ptr %storage2, i64 %a, i64 %b)
24
24
; GVN-NEXT: [[ENTRY:.*:]]
25
25
; GVN-NEXT: [[STORAGE1_I:%.*]] = ptrtoint ptr [[STORAGE1]] to i64
26
26
; GVN-NEXT: [[STORAGE2_I:%.*]] = ptrtoint ptr [[STORAGE2]] to i64
27
- ; GVN-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[ENTRY_EXIT_CRIT_EDGE:.*]]
28
- ; GVN: [[ENTRY_EXIT_CRIT_EDGE]]:
29
- ; GVN-NEXT: [[DOTPRE:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
30
- ; GVN-NEXT: [[DOTPRE1:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
31
- ; GVN-NEXT: br label %[[EXIT:.*]]
27
+ ; GVN-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[EXIT:.*]]
32
28
; GVN: [[IF_THEN]]:
33
29
; GVN-NEXT: [[DISCR1_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
34
30
; GVN-NEXT: [[DISCR2_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
@@ -38,10 +34,10 @@ define void @test_simple(i1 %cond, ptr %storage1, ptr %storage2, i64 %a, i64 %b)
38
34
; GVN-NEXT: store volatile i64 [[T2]], ptr [[STORAGE2]], align 8
39
35
; GVN-NEXT: br label %[[EXIT]]
40
36
; GVN: [[EXIT]]:
41
- ; GVN-NEXT: [[DISCR2_EXIT_PRE_PHI :%.*]] = phi i64 [ [[DOTPRE1 ]], %[[ENTRY_EXIT_CRIT_EDGE]] ], [ [[DISCR2_THEN]], %[[IF_THEN]] ]
42
- ; GVN-NEXT: [[DISCR1_EXIT_PRE_PHI :%.*]] = phi i64 [ [[DOTPRE ]], %[[ENTRY_EXIT_CRIT_EDGE]] ], [ [[DISCR1_THEN]], %[[IF_THEN]] ]
43
- ; GVN-NEXT: [[T3:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR1_EXIT_PRE_PHI ]])
44
- ; GVN-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_EXIT_PRE_PHI ]])
37
+ ; GVN-NEXT: [[DISCR1_EXIT :%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I ]], i64 42)
38
+ ; GVN-NEXT: [[DISCR2_EXIT :%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I ]], i64 42)
39
+ ; GVN-NEXT: [[T3:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR1_EXIT ]])
40
+ ; GVN-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_EXIT ]])
45
41
; GVN-NEXT: store volatile i64 [[T3]], ptr [[STORAGE1]], align 8
46
42
; GVN-NEXT: store volatile i64 [[T4]], ptr [[STORAGE2]], align 8
47
43
; GVN-NEXT: ret void
@@ -51,18 +47,20 @@ define void @test_simple(i1 %cond, ptr %storage1, ptr %storage2, i64 %a, i64 %b)
51
47
; GVN-SCFG-NEXT: [[ENTRY:.*:]]
52
48
; GVN-SCFG-NEXT: [[STORAGE1_I:%.*]] = ptrtoint ptr [[STORAGE1]] to i64
53
49
; GVN-SCFG-NEXT: [[STORAGE2_I:%.*]] = ptrtoint ptr [[STORAGE2]] to i64
54
- ; GVN-SCFG-NEXT: [[DISCR1_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
55
- ; GVN-SCFG-NEXT: [[DISCR2_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
56
50
; GVN-SCFG-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[EXIT:.*]]
57
51
; GVN-SCFG: [[IF_THEN]]:
52
+ ; GVN-SCFG-NEXT: [[DISCR1_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
53
+ ; GVN-SCFG-NEXT: [[DISCR2_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
58
54
; GVN-SCFG-NEXT: [[T1:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[A]], i32 2, i64 [[DISCR1_THEN]])
59
55
; GVN-SCFG-NEXT: [[T2:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[A]], i32 2, i64 [[DISCR2_THEN]])
60
56
; GVN-SCFG-NEXT: store volatile i64 [[T1]], ptr [[STORAGE1]], align 8
61
57
; GVN-SCFG-NEXT: store volatile i64 [[T2]], ptr [[STORAGE2]], align 8
62
58
; GVN-SCFG-NEXT: br label %[[EXIT]]
63
59
; GVN-SCFG: [[EXIT]]:
64
- ; GVN-SCFG-NEXT: [[T3:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR1_THEN]])
65
- ; GVN-SCFG-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_THEN]])
60
+ ; GVN-SCFG-NEXT: [[DISCR1_EXIT:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
61
+ ; GVN-SCFG-NEXT: [[DISCR2_EXIT:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
62
+ ; GVN-SCFG-NEXT: [[T3:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR1_EXIT]])
63
+ ; GVN-SCFG-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_EXIT]])
66
64
; GVN-SCFG-NEXT: store volatile i64 [[T3]], ptr [[STORAGE1]], align 8
67
65
; GVN-SCFG-NEXT: store volatile i64 [[T4]], ptr [[STORAGE2]], align 8
68
66
; GVN-SCFG-NEXT: ret void
@@ -100,11 +98,7 @@ define void @test_interleaved(i1 %cond, ptr %storage1, ptr %storage2, i64 %a, i6
100
98
; GVN-NEXT: [[ENTRY:.*:]]
101
99
; GVN-NEXT: [[STORAGE1_I:%.*]] = ptrtoint ptr [[STORAGE1]] to i64
102
100
; GVN-NEXT: [[STORAGE2_I:%.*]] = ptrtoint ptr [[STORAGE2]] to i64
103
- ; GVN-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[ENTRY_EXIT_CRIT_EDGE:.*]]
104
- ; GVN: [[ENTRY_EXIT_CRIT_EDGE]]:
105
- ; GVN-NEXT: [[DOTPRE:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
106
- ; GVN-NEXT: [[DOTPRE1:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
107
- ; GVN-NEXT: br label %[[EXIT:.*]]
101
+ ; GVN-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[EXIT:.*]]
108
102
; GVN: [[IF_THEN]]:
109
103
; GVN-NEXT: [[DISCR1_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
110
104
; GVN-NEXT: [[T1:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[A]], i32 2, i64 [[DISCR1_THEN]])
@@ -114,10 +108,10 @@ define void @test_interleaved(i1 %cond, ptr %storage1, ptr %storage2, i64 %a, i6
114
108
; GVN-NEXT: store volatile i64 [[T2]], ptr [[STORAGE2]], align 8
115
109
; GVN-NEXT: br label %[[EXIT]]
116
110
; GVN: [[EXIT]]:
117
- ; GVN-NEXT: [[DISCR2_EXIT_PRE_PHI :%.*]] = phi i64 [ [[DOTPRE1 ]], %[[ENTRY_EXIT_CRIT_EDGE]] ], [ [[DISCR2_THEN]], %[[IF_THEN]] ]
118
- ; GVN-NEXT: [[DISCR1_EXIT_PRE_PHI :%.*]] = phi i64 [ [[DOTPRE ]], %[[ENTRY_EXIT_CRIT_EDGE]] ], [ [[DISCR1_THEN]], %[[IF_THEN]] ]
119
- ; GVN-NEXT: [[T3 :%.*]] = call i64 @llvm.ptrauth.sign (i64 [[B ]], i32 2, i64 [[DISCR1_EXIT_PRE_PHI]] )
120
- ; GVN-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_EXIT_PRE_PHI ]])
111
+ ; GVN-NEXT: [[DISCR1_EXIT :%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I ]], i64 42)
112
+ ; GVN-NEXT: [[T3 :%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B ]], i32 2, i64 [[DISCR1_EXIT]])
113
+ ; GVN-NEXT: [[DISCR2_EXIT :%.*]] = call i64 @llvm.ptrauth.blend (i64 [[STORAGE2_I ]], i64 42 )
114
+ ; GVN-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_EXIT ]])
121
115
; GVN-NEXT: store volatile i64 [[T3]], ptr [[STORAGE1]], align 8
122
116
; GVN-NEXT: store volatile i64 [[T4]], ptr [[STORAGE2]], align 8
123
117
; GVN-NEXT: ret void
@@ -127,23 +121,20 @@ define void @test_interleaved(i1 %cond, ptr %storage1, ptr %storage2, i64 %a, i6
127
121
; GVN-SCFG-NEXT: [[ENTRY:.*:]]
128
122
; GVN-SCFG-NEXT: [[STORAGE1_I:%.*]] = ptrtoint ptr [[STORAGE1]] to i64
129
123
; GVN-SCFG-NEXT: [[STORAGE2_I:%.*]] = ptrtoint ptr [[STORAGE2]] to i64
130
- ; GVN-SCFG-NEXT: [[DISCR1_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
131
- ; GVN-SCFG-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[ENTRY_EXIT_CRIT_EDGE:.*]]
132
- ; GVN-SCFG: [[ENTRY_EXIT_CRIT_EDGE]]:
133
- ; GVN-SCFG-NEXT: [[DOTPRE1:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
134
- ; GVN-SCFG-NEXT: br label %[[EXIT:.*]]
124
+ ; GVN-SCFG-NEXT: br i1 [[COND]], label %[[IF_THEN:.*]], label %[[EXIT:.*]]
135
125
; GVN-SCFG: [[IF_THEN]]:
126
+ ; GVN-SCFG-NEXT: [[DISCR1_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I]], i64 42)
136
127
; GVN-SCFG-NEXT: [[T1:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[A]], i32 2, i64 [[DISCR1_THEN]])
137
128
; GVN-SCFG-NEXT: [[DISCR2_THEN:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE2_I]], i64 42)
138
129
; GVN-SCFG-NEXT: [[T2:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[A]], i32 2, i64 [[DISCR2_THEN]])
139
130
; GVN-SCFG-NEXT: store volatile i64 [[T1]], ptr [[STORAGE1]], align 8
140
131
; GVN-SCFG-NEXT: store volatile i64 [[T2]], ptr [[STORAGE2]], align 8
141
132
; GVN-SCFG-NEXT: br label %[[EXIT]]
142
133
; GVN-SCFG: [[EXIT]]:
143
- ; GVN-SCFG-NEXT: [[DISCR2_EXIT_PRE_PHI :%.*]] = phi i64 [ [[DOTPRE1 ]], %[[ENTRY_EXIT_CRIT_EDGE]] ], [ [[DISCR2_THEN]], %[[IF_THEN]] ]
144
- ; GVN-SCFG-NEXT: [[DISCR1_EXIT_PRE_PHI :%.*]] = phi i64 [ [[DISCR1_THEN ]], %[[ENTRY_EXIT_CRIT_EDGE]] ], [ [[DISCR1_THEN]], %[[IF_THEN]] ]
145
- ; GVN-SCFG-NEXT: [[T3 :%.*]] = call i64 @llvm.ptrauth.sign (i64 [[B ]], i32 2, i64 [[DISCR1_EXIT_PRE_PHI]] )
146
- ; GVN-SCFG-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_EXIT_PRE_PHI ]])
134
+ ; GVN-SCFG-NEXT: [[DISCR1_EXIT :%.*]] = call i64 @llvm.ptrauth.blend(i64 [[STORAGE1_I ]], i64 42)
135
+ ; GVN-SCFG-NEXT: [[T3 :%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B ]], i32 2, i64 [[DISCR1_EXIT]])
136
+ ; GVN-SCFG-NEXT: [[DISCR2_EXIT :%.*]] = call i64 @llvm.ptrauth.blend (i64 [[STORAGE2_I ]], i64 42 )
137
+ ; GVN-SCFG-NEXT: [[T4:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[B]], i32 2, i64 [[DISCR2_EXIT ]])
147
138
; GVN-SCFG-NEXT: store volatile i64 [[T3]], ptr [[STORAGE1]], align 8
148
139
; GVN-SCFG-NEXT: store volatile i64 [[T4]], ptr [[STORAGE2]], align 8
149
140
; GVN-SCFG-NEXT: ret void
0 commit comments