@@ -147,6 +147,48 @@ block4:
147
147
ret i32 %PRE
148
148
}
149
149
150
+ ; Same as test4, with a nuw flag on the GEP.
151
+ define i32 @test4_nuw (ptr %p , ptr %q , ptr %Hack , i1 %C ) {
152
+ ; CHECK-LABEL: @test4_nuw(
153
+ ; CHECK-NEXT: block1:
154
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[BLOCK2:%.*]], label [[BLOCK3:%.*]]
155
+ ; CHECK: block2:
156
+ ; CHECK-NEXT: [[P3_PHI_TRANS_INSERT:%.*]] = getelementptr nuw i32, ptr [[Q:%.*]], i32 1
157
+ ; CHECK-NEXT: [[PRE_PRE:%.*]] = load i32, ptr [[P3_PHI_TRANS_INSERT]], align 4
158
+ ; CHECK-NEXT: br label [[BLOCK4:%.*]]
159
+ ; CHECK: block3:
160
+ ; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[Q]], i32 1
161
+ ; CHECK-NEXT: store ptr [[B]], ptr [[HACK:%.*]], align 8
162
+ ; CHECK-NEXT: [[A:%.*]] = getelementptr i32, ptr [[P:%.*]], i32 1
163
+ ; CHECK-NEXT: store i32 0, ptr [[A]], align 4
164
+ ; CHECK-NEXT: br label [[BLOCK4]]
165
+ ; CHECK: block4:
166
+ ; CHECK-NEXT: [[PRE:%.*]] = phi i32 [ 0, [[BLOCK3]] ], [ [[PRE_PRE]], [[BLOCK2]] ]
167
+ ; CHECK-NEXT: [[P2:%.*]] = phi ptr [ [[P]], [[BLOCK3]] ], [ [[Q]], [[BLOCK2]] ]
168
+ ; CHECK-NEXT: [[P3:%.*]] = getelementptr nuw i32, ptr [[P2]], i32 1
169
+ ; CHECK-NEXT: ret i32 [[PRE]]
170
+ ;
171
+ block1:
172
+ br i1 %C , label %block2 , label %block3
173
+
174
+ block2:
175
+ br label %block4
176
+
177
+ block3:
178
+ %B = getelementptr i32 , ptr %q , i32 1
179
+ store ptr %B , ptr %Hack
180
+
181
+ %A = getelementptr i32 , ptr %p , i32 1
182
+ store i32 0 , ptr %A
183
+ br label %block4
184
+
185
+ block4:
186
+ %P2 = phi ptr [%p , %block3 ], [%q , %block2 ]
187
+ %P3 = getelementptr nuw i32 , ptr %P2 , i32 1
188
+ %PRE = load i32 , ptr %P3
189
+ ret i32 %PRE
190
+ }
191
+
150
192
;void test5(int N, ptr G) {
151
193
; int j;
152
194
; for (j = 0; j < N - 1; j++)
@@ -553,10 +595,10 @@ define void @test12(ptr %p) personality ptr @__CxxFrameHandler3 {
553
595
; CHECK-LABEL: @test12(
554
596
; CHECK-NEXT: block1:
555
597
; CHECK-NEXT: invoke void @f()
556
- ; CHECK-NEXT: to label [[BLOCK2:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
598
+ ; CHECK-NEXT: to label [[BLOCK2:%.*]] unwind label [[CATCH_DISPATCH:%.*]]
557
599
; CHECK: block2:
558
600
; CHECK-NEXT: invoke void @f()
559
- ; CHECK-NEXT: to label [[BLOCK3:%.*]] unwind label [[CLEANUP:%.*]]
601
+ ; CHECK-NEXT: to label [[BLOCK3:%.*]] unwind label [[CLEANUP:%.*]]
560
602
; CHECK: block3:
561
603
; CHECK-NEXT: ret void
562
604
; CHECK: catch.dispatch:
@@ -880,7 +922,7 @@ define void @test19(i1 %cond, ptr %p1, ptr %p2)
880
922
; CHECK-NEXT: br label [[END:%.*]]
881
923
; CHECK: else:
882
924
; CHECK-NEXT: invoke void @f()
883
- ; CHECK-NEXT: to label [[ELSE_END_CRIT_EDGE:%.*]] unwind label [[LPAD:%.*]]
925
+ ; CHECK-NEXT: to label [[ELSE_END_CRIT_EDGE:%.*]] unwind label [[LPAD:%.*]]
884
926
; CHECK: else.end_crit_edge:
885
927
; CHECK-NEXT: [[V1_PRE:%.*]] = load i64, ptr [[P1]], align 8
886
928
; CHECK-NEXT: br label [[END]]
@@ -891,7 +933,7 @@ define void @test19(i1 %cond, ptr %p1, ptr %p2)
891
933
; CHECK-NEXT: ret void
892
934
; CHECK: lpad:
893
935
; CHECK-NEXT: [[LP:%.*]] = landingpad { ptr, i32 }
894
- ; CHECK-NEXT: cleanup
936
+ ; CHECK-NEXT: cleanup
895
937
; CHECK-NEXT: [[V3:%.*]] = load i64, ptr [[P1]], align 8
896
938
; CHECK-NEXT: [[OR:%.*]] = or i64 [[V3]], 200
897
939
; CHECK-NEXT: store i64 [[OR]], ptr [[P1]], align 8
@@ -974,9 +1016,9 @@ define void @test21(i1 %cond, i32 %code, ptr %p1, ptr %p2) {
974
1016
; CHECK-NEXT: br label [[IF_END:%.*]]
975
1017
; CHECK: if.else:
976
1018
; CHECK-NEXT: switch i32 [[CODE:%.*]], label [[IF_END]] [
977
- ; CHECK-NEXT: i32 1, label [[IF_END]]
978
- ; CHECK-NEXT: i32 2, label [[IF_END]]
979
- ; CHECK-NEXT: i32 3, label [[IF_END]]
1019
+ ; CHECK-NEXT: i32 1, label [[IF_END]]
1020
+ ; CHECK-NEXT: i32 2, label [[IF_END]]
1021
+ ; CHECK-NEXT: i32 3, label [[IF_END]]
980
1022
; CHECK-NEXT: ]
981
1023
; CHECK: if.end:
982
1024
; CHECK-NEXT: [[V2:%.*]] = load i16, ptr [[P1]], align 2
0 commit comments