Skip to content

Commit 3ee2bb3

Browse files
antoniofrighettokrishna2803
authored andcommitted
[GVN] Add MemorySSA coverage to tests (NFC)
Test check lines have been regenerated by ensuring parity between MemDep and MemorySSA, while migrating towards the latter.
1 parent 7547615 commit 3ee2bb3

File tree

3 files changed

+1847
-605
lines changed

3 files changed

+1847
-605
lines changed

llvm/test/Analysis/TypeBasedAliasAnalysis/gvn-nonlocal-type-mismatch.ll

Lines changed: 95 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,38 @@
1-
; RUN: opt -aa-pipeline=tbaa,basic-aa -passes=gvn -S < %s | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -aa-pipeline=tbaa,basic-aa -passes=gvn -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-MEMDEP
3+
; RUN: opt -aa-pipeline=tbaa,basic-aa -passes='gvn<memoryssa>' -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK-MEMSSA
24

35
target datalayout = "e-p:64:64:64"
46

57
; GVN should ignore the store to p1 to see that the load from p is
68
; fully redundant.
79

8-
; CHECK: @yes
9-
; CHECK: if.then:
10-
; CHECK-NEXT: store i32 0, ptr %q
11-
; CHECK-NEXT: ret void
12-
1310
define void @yes(i1 %c, ptr %p, ptr %p1, ptr %q) nounwind {
11+
; CHECK-MEMDEP-LABEL: define void @yes(
12+
; CHECK-MEMDEP-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P1:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {
13+
; CHECK-MEMDEP-NEXT: [[ENTRY:.*:]]
14+
; CHECK-MEMDEP-NEXT: store i32 0, ptr [[P]], align 4, !tbaa [[TBAA0:![0-9]+]]
15+
; CHECK-MEMDEP-NEXT: store i32 1, ptr [[P1]], align 4, !tbaa [[TBAA3:![0-9]+]]
16+
; CHECK-MEMDEP-NEXT: br i1 [[C]], label %[[IF_ELSE:.*]], label %[[IF_THEN:.*]]
17+
; CHECK-MEMDEP: [[IF_THEN]]:
18+
; CHECK-MEMDEP-NEXT: store i32 0, ptr [[Q]], align 4
19+
; CHECK-MEMDEP-NEXT: ret void
20+
; CHECK-MEMDEP: [[IF_ELSE]]:
21+
; CHECK-MEMDEP-NEXT: ret void
22+
;
23+
; CHECK-MEMSSA-LABEL: define void @yes(
24+
; CHECK-MEMSSA-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P1:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {
25+
; CHECK-MEMSSA-NEXT: [[ENTRY:.*:]]
26+
; CHECK-MEMSSA-NEXT: store i32 0, ptr [[P]], align 4, !tbaa [[TBAA0:![0-9]+]]
27+
; CHECK-MEMSSA-NEXT: store i32 1, ptr [[P1]], align 4, !tbaa [[TBAA3:![0-9]+]]
28+
; CHECK-MEMSSA-NEXT: br i1 [[C]], label %[[IF_ELSE:.*]], label %[[IF_THEN:.*]]
29+
; CHECK-MEMSSA: [[IF_THEN]]:
30+
; CHECK-MEMSSA-NEXT: [[T:%.*]] = load i32, ptr [[P]], align 4, !tbaa [[TBAA0]]
31+
; CHECK-MEMSSA-NEXT: store i32 [[T]], ptr [[Q]], align 4
32+
; CHECK-MEMSSA-NEXT: ret void
33+
; CHECK-MEMSSA: [[IF_ELSE]]:
34+
; CHECK-MEMSSA-NEXT: ret void
35+
;
1436
entry:
1537
store i32 0, ptr %p, !tbaa !1
1638
store i32 1, ptr %p1, !tbaa !2
@@ -30,16 +52,22 @@ if.else:
3052
; the other type could be unified with the first type, however for now, GVN
3153
; should just be conservative.
3254

33-
; CHECK: @watch_out_for_type_change
34-
; CHECK: if.then:
35-
; CHECK: %t = load i32, ptr %p
36-
; CHECK: store i32 %t, ptr %q
37-
; CHECK: ret void
38-
; CHECK: if.else:
39-
; CHECK: %u = load i32, ptr %p
40-
; CHECK: store i32 %u, ptr %q
41-
4255
define void @watch_out_for_type_change(i1 %c, ptr %p, ptr %p1, ptr %q) nounwind {
56+
; CHECK-LABEL: define void @watch_out_for_type_change(
57+
; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P1:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {
58+
; CHECK-NEXT: [[ENTRY:.*:]]
59+
; CHECK-NEXT: store i32 0, ptr [[P]], align 4, !tbaa [[TBAA0:![0-9]+]]
60+
; CHECK-NEXT: store i32 1, ptr [[P1]], align 4, !tbaa [[TBAA3:![0-9]+]]
61+
; CHECK-NEXT: br i1 [[C]], label %[[IF_ELSE:.*]], label %[[IF_THEN:.*]]
62+
; CHECK: [[IF_THEN]]:
63+
; CHECK-NEXT: [[T:%.*]] = load i32, ptr [[P]], align 4, !tbaa [[TBAA5:![0-9]+]]
64+
; CHECK-NEXT: store i32 [[T]], ptr [[Q]], align 4
65+
; CHECK-NEXT: ret void
66+
; CHECK: [[IF_ELSE]]:
67+
; CHECK-NEXT: [[U:%.*]] = load i32, ptr [[P]], align 4, !tbaa [[TBAA8:![0-9]+]]
68+
; CHECK-NEXT: store i32 [[U]], ptr [[Q]], align 4
69+
; CHECK-NEXT: ret void
70+
;
4371
entry:
4472
store i32 0, ptr %p, !tbaa !1
4573
store i32 1, ptr %p1, !tbaa !2
@@ -59,15 +87,36 @@ if.else:
5987
; As before, but the types are swapped. This time GVN does managed to
6088
; eliminate one of the loads before noticing the type mismatch.
6189

62-
; CHECK: @watch_out_for_another_type_change
63-
; CHECK: if.then:
64-
; CHECK: store i32 0, ptr %q
65-
; CHECK: ret void
66-
; CHECK: if.else:
67-
; CHECK: %u = load i32, ptr %p
68-
; CHECK: store i32 %u, ptr %q
69-
7090
define void @watch_out_for_another_type_change(i1 %c, ptr %p, ptr %p1, ptr %q) nounwind {
91+
; CHECK-MEMDEP-LABEL: define void @watch_out_for_another_type_change(
92+
; CHECK-MEMDEP-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P1:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {
93+
; CHECK-MEMDEP-NEXT: [[ENTRY:.*:]]
94+
; CHECK-MEMDEP-NEXT: store i32 0, ptr [[P]], align 4, !tbaa [[TBAA0]]
95+
; CHECK-MEMDEP-NEXT: store i32 1, ptr [[P1]], align 4, !tbaa [[TBAA3]]
96+
; CHECK-MEMDEP-NEXT: br i1 [[C]], label %[[IF_ELSE:.*]], label %[[IF_THEN:.*]]
97+
; CHECK-MEMDEP: [[IF_THEN]]:
98+
; CHECK-MEMDEP-NEXT: store i32 0, ptr [[Q]], align 4
99+
; CHECK-MEMDEP-NEXT: ret void
100+
; CHECK-MEMDEP: [[IF_ELSE]]:
101+
; CHECK-MEMDEP-NEXT: [[U:%.*]] = load i32, ptr [[P]], align 4, !tbaa [[TBAA5]]
102+
; CHECK-MEMDEP-NEXT: store i32 [[U]], ptr [[Q]], align 4
103+
; CHECK-MEMDEP-NEXT: ret void
104+
;
105+
; CHECK-MEMSSA-LABEL: define void @watch_out_for_another_type_change(
106+
; CHECK-MEMSSA-SAME: i1 [[C:%.*]], ptr [[P:%.*]], ptr [[P1:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {
107+
; CHECK-MEMSSA-NEXT: [[ENTRY:.*:]]
108+
; CHECK-MEMSSA-NEXT: store i32 0, ptr [[P]], align 4, !tbaa [[TBAA0]]
109+
; CHECK-MEMSSA-NEXT: store i32 1, ptr [[P1]], align 4, !tbaa [[TBAA3]]
110+
; CHECK-MEMSSA-NEXT: br i1 [[C]], label %[[IF_ELSE:.*]], label %[[IF_THEN:.*]]
111+
; CHECK-MEMSSA: [[IF_THEN]]:
112+
; CHECK-MEMSSA-NEXT: [[T:%.*]] = load i32, ptr [[P]], align 4, !tbaa [[TBAA8]]
113+
; CHECK-MEMSSA-NEXT: store i32 [[T]], ptr [[Q]], align 4
114+
; CHECK-MEMSSA-NEXT: ret void
115+
; CHECK-MEMSSA: [[IF_ELSE]]:
116+
; CHECK-MEMSSA-NEXT: [[U:%.*]] = load i32, ptr [[P]], align 4, !tbaa [[TBAA5]]
117+
; CHECK-MEMSSA-NEXT: store i32 [[U]], ptr [[Q]], align 4
118+
; CHECK-MEMSSA-NEXT: ret void
119+
;
71120
entry:
72121
store i32 0, ptr %p, !tbaa !1
73122
store i32 1, ptr %p1, !tbaa !2
@@ -94,3 +143,26 @@ if.else:
94143
!7 = !{!"outer space", !9}
95144
!8 = !{!"brick red", !5}
96145
!9 = !{!"observable universe"}
146+
;.
147+
; CHECK-MEMDEP: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
148+
; CHECK-MEMDEP: [[META1]] = !{!"red", [[META2:![0-9]+]]}
149+
; CHECK-MEMDEP: [[META2]] = !{}
150+
; CHECK-MEMDEP: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0}
151+
; CHECK-MEMDEP: [[META4]] = !{!"blu", [[META2]]}
152+
; CHECK-MEMDEP: [[TBAA5]] = !{[[META6:![0-9]+]], [[META6]], i64 0}
153+
; CHECK-MEMDEP: [[META6]] = !{!"outer space", [[META7:![0-9]+]]}
154+
; CHECK-MEMDEP: [[META7]] = !{!"observable universe"}
155+
; CHECK-MEMDEP: [[TBAA8]] = !{[[META9:![0-9]+]], [[META9]], i64 0}
156+
; CHECK-MEMDEP: [[META9]] = !{!"brick red", [[META1]]}
157+
;.
158+
; CHECK-MEMSSA: [[TBAA0]] = !{[[META1:![0-9]+]], [[META1]], i64 0}
159+
; CHECK-MEMSSA: [[META1]] = !{!"red", [[META2:![0-9]+]]}
160+
; CHECK-MEMSSA: [[META2]] = !{}
161+
; CHECK-MEMSSA: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0}
162+
; CHECK-MEMSSA: [[META4]] = !{!"blu", [[META2]]}
163+
; CHECK-MEMSSA: [[TBAA5]] = !{[[META6:![0-9]+]], [[META6]], i64 0}
164+
; CHECK-MEMSSA: [[META6]] = !{!"outer space", [[META7:![0-9]+]]}
165+
; CHECK-MEMSSA: [[META7]] = !{!"observable universe"}
166+
; CHECK-MEMSSA: [[TBAA8]] = !{[[META9:![0-9]+]], [[META9]], i64 0}
167+
; CHECK-MEMSSA: [[META9]] = !{!"brick red", [[META1]]}
168+
;.

llvm/test/Transforms/GVN/PRE/pre-after-rle.ll

Lines changed: 98 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,52 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt -passes='require<phi-values>,gvn' -S < %s | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes='require<phi-values>,gvn' -S < %s | FileCheck %s --check-prefixes=CHECK-MEMDEP
3+
; RUN: opt -passes='require<phi-values>,gvn<memoryssa>' -S < %s | FileCheck %s --check-prefixes=CHECK-MEMSSA
34

45
declare noalias ptr @malloc(i64)
56

67
; Detecting that %s is fully redundant should let us detect that %w is partially
78
; redundant.
89
define void @fn1(ptr noalias %start, ptr %width, i32 %h) {
9-
; CHECK-LABEL: @fn1(
10-
; CHECK-NEXT: entry:
11-
; CHECK-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024)
12-
; CHECK-NEXT: store ptr [[CALL]], ptr [[START:%.*]], align 8
13-
; CHECK-NEXT: br label [[PREHEADER:%.*]]
14-
; CHECK: preheader:
15-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H:%.*]]
16-
; CHECK-NEXT: br i1 [[CMP]], label [[PREHEADER_BODY_CRIT_EDGE:%.*]], label [[EXIT:%.*]]
17-
; CHECK: preheader.body_crit_edge:
18-
; CHECK-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH:%.*]], align 8
19-
; CHECK-NEXT: br label [[BODY:%.*]]
20-
; CHECK: body:
21-
; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], [[BODY]] ]
22-
; CHECK-NEXT: store i32 0, ptr [[CALL]], align 4
23-
; CHECK-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1
24-
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]]
25-
; CHECK-NEXT: br i1 [[CMP3]], label [[BODY]], label [[PREHEADER]]
26-
; CHECK: exit:
27-
; CHECK-NEXT: ret void
10+
; CHECK-MEMDEP-LABEL: define void @fn1(
11+
; CHECK-MEMDEP-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]]) {
12+
; CHECK-MEMDEP-NEXT: [[ENTRY:.*:]]
13+
; CHECK-MEMDEP-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024)
14+
; CHECK-MEMDEP-NEXT: store ptr [[CALL]], ptr [[START]], align 8
15+
; CHECK-MEMDEP-NEXT: br label %[[PREHEADER:.*]]
16+
; CHECK-MEMDEP: [[PREHEADER]]:
17+
; CHECK-MEMDEP-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]]
18+
; CHECK-MEMDEP-NEXT: br i1 [[CMP]], label %[[PREHEADER_BODY_CRIT_EDGE:.*]], label %[[EXIT:.*]]
19+
; CHECK-MEMDEP: [[PREHEADER_BODY_CRIT_EDGE]]:
20+
; CHECK-MEMDEP-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH]], align 8
21+
; CHECK-MEMDEP-NEXT: br label %[[BODY:.*]]
22+
; CHECK-MEMDEP: [[BODY]]:
23+
; CHECK-MEMDEP-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], %[[BODY]] ]
24+
; CHECK-MEMDEP-NEXT: store i32 0, ptr [[CALL]], align 4
25+
; CHECK-MEMDEP-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1
26+
; CHECK-MEMDEP-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]]
27+
; CHECK-MEMDEP-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]]
28+
; CHECK-MEMDEP: [[EXIT]]:
29+
; CHECK-MEMDEP-NEXT: ret void
30+
;
31+
; CHECK-MEMSSA-LABEL: define void @fn1(
32+
; CHECK-MEMSSA-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]]) {
33+
; CHECK-MEMSSA-NEXT: [[ENTRY:.*:]]
34+
; CHECK-MEMSSA-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024)
35+
; CHECK-MEMSSA-NEXT: store ptr [[CALL]], ptr [[START]], align 8
36+
; CHECK-MEMSSA-NEXT: br label %[[PREHEADER:.*]]
37+
; CHECK-MEMSSA: [[PREHEADER]]:
38+
; CHECK-MEMSSA-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]]
39+
; CHECK-MEMSSA-NEXT: br i1 [[CMP]], label %[[BODY:.*]], label %[[EXIT:.*]]
40+
; CHECK-MEMSSA: [[BODY]]:
41+
; CHECK-MEMSSA-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER]] ], [ [[J_NEXT:%.*]], %[[BODY]] ]
42+
; CHECK-MEMSSA-NEXT: [[S:%.*]] = load ptr, ptr [[START]], align 8
43+
; CHECK-MEMSSA-NEXT: store i32 0, ptr [[S]], align 4
44+
; CHECK-MEMSSA-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1
45+
; CHECK-MEMSSA-NEXT: [[W:%.*]] = load i32, ptr [[WIDTH]], align 8
46+
; CHECK-MEMSSA-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W]]
47+
; CHECK-MEMSSA-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]]
48+
; CHECK-MEMSSA: [[EXIT]]:
49+
; CHECK-MEMSSA-NEXT: ret void
2850
;
2951
entry:
3052
%call = tail call noalias ptr @malloc(i64 1024)
@@ -52,33 +74,61 @@ exit:
5274
; %w is partially redundant requires alias analysis that can analyze those
5375
; values.
5476
define void @fn2(ptr noalias %start, ptr %width, i32 %h, i32 %arg) {
55-
; CHECK-LABEL: @fn2(
56-
; CHECK-NEXT: entry:
57-
; CHECK-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024)
58-
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ARG:%.*]], 0
59-
; CHECK-NEXT: br i1 [[CMP1]], label [[IF:%.*]], label [[ELSE:%.*]]
60-
; CHECK: if:
61-
; CHECK-NEXT: store ptr [[CALL]], ptr [[START:%.*]], align 8
62-
; CHECK-NEXT: br label [[PREHEADER:%.*]]
63-
; CHECK: else:
64-
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i32 [[ARG]]
65-
; CHECK-NEXT: store ptr [[GEP]], ptr [[START]], align 8
66-
; CHECK-NEXT: br label [[PREHEADER]]
67-
; CHECK: preheader:
68-
; CHECK-NEXT: [[S:%.*]] = phi ptr [ [[S]], [[BODY:%.*]] ], [ [[GEP]], [[ELSE]] ], [ [[CALL]], [[IF]] ]
69-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H:%.*]]
70-
; CHECK-NEXT: br i1 [[CMP]], label [[PREHEADER_BODY_CRIT_EDGE:%.*]], label [[EXIT:%.*]]
71-
; CHECK: preheader.body_crit_edge:
72-
; CHECK-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH:%.*]], align 8
73-
; CHECK-NEXT: br label [[BODY]]
74-
; CHECK: body:
75-
; CHECK-NEXT: [[J:%.*]] = phi i32 [ 0, [[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], [[BODY]] ]
76-
; CHECK-NEXT: store i32 0, ptr [[S]], align 4
77-
; CHECK-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1
78-
; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]]
79-
; CHECK-NEXT: br i1 [[CMP3]], label [[BODY]], label [[PREHEADER]]
80-
; CHECK: exit:
81-
; CHECK-NEXT: ret void
77+
; CHECK-MEMDEP-LABEL: define void @fn2(
78+
; CHECK-MEMDEP-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]], i32 [[ARG:%.*]]) {
79+
; CHECK-MEMDEP-NEXT: [[ENTRY:.*:]]
80+
; CHECK-MEMDEP-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024)
81+
; CHECK-MEMDEP-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ARG]], 0
82+
; CHECK-MEMDEP-NEXT: br i1 [[CMP1]], label %[[IF:.*]], label %[[ELSE:.*]]
83+
; CHECK-MEMDEP: [[IF]]:
84+
; CHECK-MEMDEP-NEXT: store ptr [[CALL]], ptr [[START]], align 8
85+
; CHECK-MEMDEP-NEXT: br label %[[PREHEADER:.*]]
86+
; CHECK-MEMDEP: [[ELSE]]:
87+
; CHECK-MEMDEP-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i32 [[ARG]]
88+
; CHECK-MEMDEP-NEXT: store ptr [[GEP]], ptr [[START]], align 8
89+
; CHECK-MEMDEP-NEXT: br label %[[PREHEADER]]
90+
; CHECK-MEMDEP: [[PREHEADER]]:
91+
; CHECK-MEMDEP-NEXT: [[S:%.*]] = phi ptr [ [[S]], %[[BODY:.*]] ], [ [[GEP]], %[[ELSE]] ], [ [[CALL]], %[[IF]] ]
92+
; CHECK-MEMDEP-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]]
93+
; CHECK-MEMDEP-NEXT: br i1 [[CMP]], label %[[PREHEADER_BODY_CRIT_EDGE:.*]], label %[[EXIT:.*]]
94+
; CHECK-MEMDEP: [[PREHEADER_BODY_CRIT_EDGE]]:
95+
; CHECK-MEMDEP-NEXT: [[W_PRE:%.*]] = load i32, ptr [[WIDTH]], align 8
96+
; CHECK-MEMDEP-NEXT: br label %[[BODY]]
97+
; CHECK-MEMDEP: [[BODY]]:
98+
; CHECK-MEMDEP-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER_BODY_CRIT_EDGE]] ], [ [[J_NEXT:%.*]], %[[BODY]] ]
99+
; CHECK-MEMDEP-NEXT: store i32 0, ptr [[S]], align 4
100+
; CHECK-MEMDEP-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1
101+
; CHECK-MEMDEP-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W_PRE]]
102+
; CHECK-MEMDEP-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]]
103+
; CHECK-MEMDEP: [[EXIT]]:
104+
; CHECK-MEMDEP-NEXT: ret void
105+
;
106+
; CHECK-MEMSSA-LABEL: define void @fn2(
107+
; CHECK-MEMSSA-SAME: ptr noalias [[START:%.*]], ptr [[WIDTH:%.*]], i32 [[H:%.*]], i32 [[ARG:%.*]]) {
108+
; CHECK-MEMSSA-NEXT: [[ENTRY:.*:]]
109+
; CHECK-MEMSSA-NEXT: [[CALL:%.*]] = tail call noalias ptr @malloc(i64 1024)
110+
; CHECK-MEMSSA-NEXT: [[CMP1:%.*]] = icmp slt i32 [[ARG]], 0
111+
; CHECK-MEMSSA-NEXT: br i1 [[CMP1]], label %[[IF:.*]], label %[[ELSE:.*]]
112+
; CHECK-MEMSSA: [[IF]]:
113+
; CHECK-MEMSSA-NEXT: store ptr [[CALL]], ptr [[START]], align 8
114+
; CHECK-MEMSSA-NEXT: br label %[[PREHEADER:.*]]
115+
; CHECK-MEMSSA: [[ELSE]]:
116+
; CHECK-MEMSSA-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[CALL]], i32 [[ARG]]
117+
; CHECK-MEMSSA-NEXT: store ptr [[GEP]], ptr [[START]], align 8
118+
; CHECK-MEMSSA-NEXT: br label %[[PREHEADER]]
119+
; CHECK-MEMSSA: [[PREHEADER]]:
120+
; CHECK-MEMSSA-NEXT: [[CMP:%.*]] = icmp slt i32 1, [[H]]
121+
; CHECK-MEMSSA-NEXT: br i1 [[CMP]], label %[[BODY:.*]], label %[[EXIT:.*]]
122+
; CHECK-MEMSSA: [[BODY]]:
123+
; CHECK-MEMSSA-NEXT: [[J:%.*]] = phi i32 [ 0, %[[PREHEADER]] ], [ [[J_NEXT:%.*]], %[[BODY]] ]
124+
; CHECK-MEMSSA-NEXT: [[S:%.*]] = load ptr, ptr [[START]], align 8
125+
; CHECK-MEMSSA-NEXT: store i32 0, ptr [[S]], align 4
126+
; CHECK-MEMSSA-NEXT: [[J_NEXT]] = add nuw nsw i32 [[J]], 1
127+
; CHECK-MEMSSA-NEXT: [[W:%.*]] = load i32, ptr [[WIDTH]], align 8
128+
; CHECK-MEMSSA-NEXT: [[CMP3:%.*]] = icmp slt i32 [[J_NEXT]], [[W]]
129+
; CHECK-MEMSSA-NEXT: br i1 [[CMP3]], label %[[BODY]], label %[[PREHEADER]]
130+
; CHECK-MEMSSA: [[EXIT]]:
131+
; CHECK-MEMSSA-NEXT: ret void
82132
;
83133
entry:
84134
%call = tail call noalias ptr @malloc(i64 1024)

0 commit comments

Comments
 (0)