@@ -101,6 +101,47 @@ bb3:
101
101
ret i32 0
102
102
}
103
103
104
+ ; Remove redundant store if loaded value is in another block inside a loop.
105
+ define i32 @test31 (i1 %c , i32* %p , i32 %i ) {
106
+ ; CHECK-LABEL: @test31(
107
+ ; CHECK-NEXT: entry:
108
+ ; CHECK-NEXT: br label [[BB1:%.*]]
109
+ ; CHECK: bb1:
110
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1]], label [[BB2:%.*]]
111
+ ; CHECK: bb2:
112
+ ; CHECK-NEXT: ret i32 0
113
+ ;
114
+ entry:
115
+ %v = load i32 , i32* %p , align 4
116
+ br label %bb1
117
+ bb1:
118
+ store i32 %v , i32* %p , align 4
119
+ br i1 %c , label %bb1 , label %bb2
120
+ bb2:
121
+ ret i32 0
122
+ }
123
+
124
+ ; Don't remove "redundant" store if %p is possibly stored to.
125
+ define i32 @test46 (i1 %c , i32* %p , i32* %p2 , i32 %i ) {
126
+ ; CHECK-LABEL: @test46(
127
+ ; CHECK: load
128
+ ; CHECK: store
129
+ ; CHECK: store
130
+ ; CHECK: ret i32 0
131
+ ;
132
+ entry:
133
+ %v = load i32 , i32* %p , align 4
134
+ br label %bb1
135
+ bb1:
136
+ store i32 %v , i32* %p , align 4
137
+ br i1 %c , label %bb1 , label %bb2
138
+ bb2:
139
+ store i32 0 , i32* %p2 , align 4
140
+ br i1 %c , label %bb3 , label %bb1
141
+ bb3:
142
+ ret i32 0
143
+ }
144
+
104
145
declare void @unknown_func ()
105
146
106
147
; Remove redundant store, which is in the lame loop as the load.
@@ -112,7 +153,7 @@ define i32 @test33(i1 %c, i32* %p, i32 %i) {
112
153
; CHECK-NEXT: br label [[BB2:%.*]]
113
154
; CHECK: bb2:
114
155
; CHECK-NEXT: call void @unknown_func()
115
- ; CHECK-NEXT: br i1 undef , label [[BB1]], label [[BB3:%.*]]
156
+ ; CHECK-NEXT: br i1 [[C:%.*]] , label [[BB1]], label [[BB3:%.*]]
116
157
; CHECK: bb3:
117
158
; CHECK-NEXT: ret i32 0
118
159
;
125
166
store i32 %v , i32* %p , align 4
126
167
; Might read and overwrite value at %p, but doesn't matter.
127
168
call void @unknown_func ()
128
- br i1 undef , label %bb1 , label %bb3
169
+ br i1 %c , label %bb1 , label %bb3
129
170
bb3:
130
171
ret i32 0
131
172
}
@@ -168,4 +209,52 @@ define void @test45(i32* %Q) {
168
209
ret void
169
210
}
170
211
212
+ define i32 @test48 (i1 %c , i32* %p ) {
213
+ ; CHECK-LABEL: @test48(
214
+ ; CHECK: entry:
215
+ ; CHECK-NEXT: [[V:%.*]] = load
216
+ ; CHECK: store i32 0
217
+ ; CHECK: store i32 [[V]]
218
+ ; CHECK: ret i32 0
219
+ entry:
220
+ %v = load i32 , i32* %p , align 4
221
+ br i1 %c , label %bb0 , label %bb0.0
222
+
223
+ bb0:
224
+ store i32 0 , i32* %p
225
+ br i1 %c , label %bb1 , label %bb2
226
+
227
+ bb0.0 :
228
+ br label %bb1
229
+
230
+ bb1:
231
+ store i32 %v , i32* %p , align 4
232
+ br i1 %c , label %bb2 , label %bb0
233
+ bb2:
234
+ ret i32 0
235
+ }
236
+
237
+ ; TODO: Remove both redundant stores if loaded value is in another block inside a loop.
238
+ define i32 @test47 (i1 %c , i32* %p , i32 %i ) {
239
+ ; X-CHECK-LABEL: @test47(
240
+ ; X-CHECK-NEXT: entry:
241
+ ; X-CHECK-NEXT: br label [[BB1:%.*]]
242
+ ; X-CHECK: bb1:
243
+ ; X-CHECK-NEXT: br i1 [[C:%.*]], label [[BB1]], label [[BB2:%.*]]
244
+ ; X-CHECK: bb2:
245
+ ; X-CHECK-NEXT: br i1 [[C]], label [[BB2]], label [[BB3:%.*]]
246
+ ; X-CHECK: bb3:
247
+ ; X-CHECK-NEXT: ret i32 0
248
+ entry:
249
+ %v = load i32 , i32* %p , align 4
250
+ br label %bb1
251
+ bb1:
252
+ store i32 %v , i32* %p , align 4
253
+ br i1 %c , label %bb1 , label %bb2
254
+ bb2:
255
+ store i32 %v , i32* %p , align 4
256
+ br i1 %c , label %bb3 , label %bb1
257
+ bb3:
258
+ ret i32 0
259
+ }
171
260
0 commit comments