1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2
- ; RUN: opt -opaque-pointers=0 < %s -passes=newgvn -S | FileCheck %s
2
+ ; RUN: opt < %s -passes=newgvn -S | FileCheck %s
3
3
;; Now that we do store refinement, we have to verify that we add fake uses
4
4
;; when we skip existing stores.
5
5
;; We also are testing that various variations that cause stores to move classes
@@ -11,25 +11,23 @@ target triple = "x86_64-apple-darwin16.5.0"
11
11
12
12
%struct.eggs = type {}
13
13
14
- define void @spam (i32 * %a ) {
14
+ define void @spam (ptr %a ) {
15
15
; CHECK-LABEL: @spam(
16
16
; CHECK-NEXT: bb:
17
- ; CHECK-NEXT: [[FOO:%.*]] = bitcast i32* [[A:%.*]] to %struct.eggs**
18
- ; CHECK-NEXT: store %struct.eggs* null, %struct.eggs** [[FOO]], align 8
17
+ ; CHECK-NEXT: store ptr null, ptr [[A:%.*]], align 8
19
18
; CHECK-NEXT: br label [[BB1:%.*]]
20
19
; CHECK: bb1:
21
20
; CHECK-NEXT: br i1 undef, label [[BB3:%.*]], label [[BB2:%.*]]
22
21
; CHECK: bb2:
23
22
; CHECK-NEXT: call void @baz()
24
23
; CHECK-NEXT: br label [[BB1]]
25
24
; CHECK: bb3:
26
- ; CHECK-NEXT: store i32 0, i32* undef, align 4
27
- ; CHECK-NEXT: store %struct.eggs* null, %struct.eggs** [[FOO ]], align 8
25
+ ; CHECK-NEXT: store i32 0, ptr undef, align 4
26
+ ; CHECK-NEXT: store ptr null, ptr [[A ]], align 8
28
27
; CHECK-NEXT: unreachable
29
28
;
30
29
bb:
31
- %foo = bitcast i32 *%a to %struct.eggs**
32
- store %struct.eggs* null , %struct.eggs** %foo
30
+ store ptr null , ptr %a
33
31
br label %bb1
34
32
35
33
bb1: ; preds = %bb2, %bb
@@ -40,13 +38,13 @@ bb2: ; preds = %bb1
40
38
br label %bb1
41
39
42
40
bb3: ; preds = %bb1
43
- store i32 0 , i32* undef
41
+ store i32 0 , ptr undef
44
42
;; This store is defined by a memoryphi of the call and the first store
45
43
;; At first, we will prove it equivalent to the first store above.
46
44
;; Then the call will become reachable, and the equivalence will be removed
47
45
;; Without it being a use of the first store, we will not update the store
48
46
;; to reflect this.
49
- store %struct.eggs* null , %struct.eggs** %foo
47
+ store ptr null , ptr %a
50
48
unreachable
51
49
}
52
50
@@ -58,48 +56,46 @@ define void @a() {
58
56
; CHECK-NEXT: b:
59
57
; CHECK-NEXT: br label [[C:%.*]]
60
58
; CHECK: c:
61
- ; CHECK-NEXT: store i64 undef, i64* null, align 4
59
+ ; CHECK-NEXT: store i64 undef, ptr null, align 4
62
60
; CHECK-NEXT: br label [[E:%.*]]
63
61
; CHECK: e:
64
- ; CHECK-NEXT: [[G:%.*]] = load i64*, i64** null, align 8
65
- ; CHECK-NEXT: store i64* undef, i64** null, align 8
62
+ ; CHECK-NEXT: store ptr undef, ptr null, align 8
66
63
; CHECK-NEXT: br i1 undef, label [[C]], label [[E]]
67
64
;
68
65
b:
69
66
br label %c
70
67
71
68
c: ; preds = %e, %b
72
- %d = phi i64* [ undef , %b ], [ null , %e ]
73
- store i64 undef , i64* %d
69
+ %d = phi ptr [ undef , %b ], [ null , %e ]
70
+ store i64 undef , ptr %d
74
71
br label %e
75
72
76
73
e: ; preds = %e, %c
77
74
;; The memory for this load starts out equivalent to just the store in c, we later discover the store after us, and
78
75
;; need to make sure the right set of values get marked as changed after memory leaders change
79
- %g = load i64* , i64** null
80
- %0 = bitcast i64* %g to i64*
81
- store i64* undef , i64** null
76
+ %g = load ptr , ptr null
77
+ store ptr undef , ptr null
82
78
br i1 undef , label %c , label %e
83
79
}
84
80
85
81
%struct.hoge = type {}
86
82
87
- define void @widget (%struct.hoge* %arg ) {
83
+ define void @widget (ptr %arg ) {
88
84
; CHECK-LABEL: @widget(
89
85
; CHECK-NEXT: bb:
90
86
; CHECK-NEXT: br label [[BB1:%.*]]
91
87
; CHECK: bb1:
92
- ; CHECK-NEXT: [[TMP:%.*]] = phi %struct.hoge* [ [[ARG:%.*]], [[BB:%.*]] ], [ null, [[BB1]] ]
93
- ; CHECK-NEXT: store %struct.hoge* [[TMP]], %struct.hoge** undef, align 8
88
+ ; CHECK-NEXT: [[TMP:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ null, [[BB1]] ]
89
+ ; CHECK-NEXT: store ptr [[TMP]], ptr undef, align 8
94
90
; CHECK-NEXT: br i1 undef, label [[BB1]], label [[BB2:%.*]]
95
91
; CHECK: bb2:
96
92
; CHECK-NEXT: [[TMP3:%.*]] = phi i64 [ [[TMP8:%.*]], [[BB7:%.*]] ], [ 0, [[BB1]] ]
97
93
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[TMP3]], 0
98
94
; CHECK-NEXT: br i1 [[TMP4]], label [[BB7]], label [[BB5:%.*]]
99
95
; CHECK: bb5:
100
- ; CHECK-NEXT: [[TMP6:%.*]] = load i64, i64* null, align 4
96
+ ; CHECK-NEXT: [[TMP6:%.*]] = load i64, ptr null, align 4
101
97
; CHECK-NEXT: call void @quux()
102
- ; CHECK-NEXT: store i64 [[TMP6]], i64* undef, align 4
98
+ ; CHECK-NEXT: store i64 [[TMP6]], ptr undef, align 4
103
99
; CHECK-NEXT: br label [[BB7]]
104
100
; CHECK: bb7:
105
101
; CHECK-NEXT: [[TMP8]] = add i64 [[TMP3]], 1
109
105
br label %bb1
110
106
111
107
bb1: ; preds = %bb1, %bb
112
- %tmp = phi %struct.hoge* [ %arg , %bb ], [ null , %bb1 ]
113
- store %struct.hoge* %tmp , %struct.hoge** undef
108
+ %tmp = phi ptr [ %arg , %bb ], [ null , %bb1 ]
109
+ store ptr %tmp , ptr undef
114
110
br i1 undef , label %bb1 , label %bb2
115
111
116
112
bb2: ; preds = %bb7, %bb1
@@ -121,9 +117,9 @@ bb2: ; preds = %bb7, %bb1
121
117
bb5: ; preds = %bb2
122
118
;; Originally thought equal to the store that comes after it until the phi edges
123
119
;; are completely traversed
124
- %tmp6 = load i64 , i64* null
120
+ %tmp6 = load i64 , ptr null
125
121
call void @quux ()
126
- store i64 %tmp6 , i64* undef
122
+ store i64 %tmp6 , ptr undef
127
123
br label %bb7
128
124
129
125
bb7: ; preds = %bb5, %bb2
@@ -142,9 +138,7 @@ define void @b() {
142
138
; CHECK: m:
143
139
; CHECK-NEXT: unreachable
144
140
; CHECK: d:
145
- ; CHECK-NEXT: [[G:%.*]] = bitcast %struct.a* [[C]] to i8*
146
- ; CHECK-NEXT: [[F:%.*]] = bitcast i8* [[G]] to i32*
147
- ; CHECK-NEXT: [[E:%.*]] = load i32, i32* [[F]], align 4
141
+ ; CHECK-NEXT: [[E:%.*]] = load i32, ptr [[C]], align 4
148
142
; CHECK-NEXT: br i1 undef, label [[I:%.*]], label [[J:%.*]]
149
143
; CHECK: i:
150
144
; CHECK-NEXT: br i1 undef, label [[K:%.*]], label [[M:%.*]]
@@ -159,14 +153,12 @@ define void @b() {
159
153
br label %d
160
154
161
155
m: ; preds = %j, %i
162
- store i32 %e , i32* %f
156
+ store i32 %e , ptr %h
163
157
unreachable
164
158
165
159
d: ; preds = %0
166
- %g = bitcast %struct.a* %c to i8*
167
- %h = getelementptr i8 , i8* %g
168
- %f = bitcast i8* %h to i32*
169
- %e = load i32 , i32* %f
160
+ %h = getelementptr i8 , ptr %c
161
+ %e = load i32 , ptr %h
170
162
br i1 undef , label %i , label %j
171
163
172
164
i: ; preds = %d
@@ -179,7 +171,7 @@ l: ; preds = %k
179
171
%n = phi i32 [ %e , %k ]
180
172
;; Becomes equal and then not equal to the other store, and
181
173
;; along the way, the load.
182
- store i32 %n , i32* %f
174
+ store i32 %n , ptr %h
183
175
unreachable
184
176
185
177
j: ; preds = %d
0 commit comments