forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFlipFlopBaseAddress.ll
136 lines (108 loc) · 4.58 KB
/
FlipFlopBaseAddress.ll
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
; RUN: | FileCheck %s
; Check that dependence analysis correctly handles flip-flop of base addresses.
; Bug 41488 - https://github.com/llvm/llvm-project/issues/41488
; CHECK-LABEL: bug41488_test1
; CHECK-NOT: da analyze - none!
define float @bug41488_test1() {
entry:
%g = alloca float, align 4
%h = alloca float, align 4
br label %for.body
for.body:
%p = phi float* [ %g, %entry ], [ %q, %for.body ]
%q = phi float* [ %h, %entry ], [ %p, %for.body ]
%0 = load float, float* %p, align 4
store float undef, float* %q, align 4
%branch_cond = fcmp ugt float %0, 0.0
br i1 %branch_cond, label %for.cond.cleanup, label %for.body
for.cond.cleanup:
ret float undef
}
; CHECK-LABEL: bug41488_test2
; CHECK-NOT: da analyze - none!
define void @bug41488_test2(i32 %n) {
entry:
%g = alloca float, align 4
%h = alloca float, align 4
br label %for.body
for.body:
%i = phi i32 [0, %entry ], [ %inc, %for.body ]
%p = phi float* [ %g, %entry ], [ %q, %for.body ]
%q = phi float* [ %h, %entry ], [ %p, %for.body ]
%0 = load float, float* %p, align 4
store float 0.0, float* %q, align 4
%inc = add nuw i32 %i, 1
%branch_cond = icmp ult i32 %i, %n
br i1 %branch_cond, label %for.body, label %for.cond.cleanup
for.cond.cleanup:
ret void
}
; Bug 53942 - https://github.com/llvm/llvm-project/issues/53942
; CHECK-LABEL: bug53942_foo
; CHECK-NOT: da analyze - none!
define void @bug53942_foo(i32 noundef %n, ptr noalias nocapture noundef writeonly %A, ptr noalias nocapture noundef %B) {
entry:
%cmp8 = icmp sgt i32 %n, 1
br i1 %cmp8, label %for.body.preheader, label %for.cond.cleanup
for.body.preheader: ; preds = %entry
%wide.trip.count = zext nneg i32 %n to i64
br label %for.body
for.cond.cleanup: ; preds = %for.body, %entry
ret void
for.body: ; preds = %for.body.preheader, %for.body
%indvars.iv = phi i64 [ 1, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
%ptr1.011 = phi ptr [ %A, %for.body.preheader ], [ %ptr2.09, %for.body ]
%ptr2.09 = phi ptr [ %B, %for.body.preheader ], [ %ptr1.011, %for.body ]
%.pre = load double, ptr %B, align 8
%arrayidx2 = getelementptr inbounds double, ptr %ptr1.011, i64 %indvars.iv
store double %.pre, ptr %arrayidx2, align 8
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
%exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}
; Bug 53942 - https://github.com/llvm/llvm-project/issues/53942
; CHECK-LABEL: bug53942_bar
; CHECK-NOT: da analyze - none!
define void @bug53942_bar(i32 noundef %n, ptr noalias noundef %A, ptr noalias noundef %B) {
entry:
br label %for.cond
for.cond: ; preds = %for.inc, %entry
%i.0 = phi i32 [ 1, %entry ], [ %inc, %for.inc ]
%cmp = icmp slt i32 %i.0, %n
br i1 %cmp, label %for.body, label %for.cond.cleanup
for.cond.cleanup: ; preds = %for.cond
br label %for.end
for.body: ; preds = %for.cond
%and = and i32 %i.0, 2
%tobool.not = icmp eq i32 %and, 0
br i1 %tobool.not, label %cond.false, label %cond.true
cond.true: ; preds = %for.body
br label %cond.end
cond.false: ; preds = %for.body
br label %cond.end
cond.end: ; preds = %cond.false, %cond.true
%cond = phi ptr [ %A, %cond.true ], [ %B, %cond.false ]
%and1 = and i32 %i.0, 2
%tobool2.not = icmp eq i32 %and1, 0
br i1 %tobool2.not, label %cond.false4, label %cond.true3
cond.true3: ; preds = %cond.end
br label %cond.end5
cond.false4: ; preds = %cond.end
br label %cond.end5
cond.end5: ; preds = %cond.false4, %cond.true3
%cond6 = phi ptr [ %B, %cond.true3 ], [ %A, %cond.false4 ]
%sub = add nsw i32 %i.0, -1
%idxprom = sext i32 %sub to i64
%arrayidx = getelementptr inbounds double, ptr %cond6, i64 %idxprom
%0 = load double, ptr %arrayidx, align 8
%idxprom7 = zext nneg i32 %i.0 to i64
%arrayidx8 = getelementptr inbounds double, ptr %cond, i64 %idxprom7
store double %0, ptr %arrayidx8, align 8
br label %for.inc
for.inc: ; preds = %cond.end5
%inc = add nuw nsw i32 %i.0, 1
br label %for.cond
for.end: ; preds = %for.cond.cleanup
ret void
}