@@ -11,12 +11,12 @@ define void @f(i32 %ptr_i, ptr %ptr2, i1 %cond) {
11
11
; CHECK-NEXT: store i32 0, ptr [[PTR2:%.*]], align 4
12
12
; CHECK-NEXT: br label [[FOR_BODY_LR_PH]]
13
13
; CHECK: for.body.lr.ph:
14
- ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR]], align 4
15
14
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
16
15
; CHECK: for.body:
17
16
; CHECK-NEXT: [[I_08:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]
18
17
; CHECK-NEXT: br i1 [[COND]], label [[IF_END]], label [[IF:%.*]]
19
18
; CHECK: if:
19
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR]], align 4, !invariant.load [[META0:![0-9]+]]
20
20
; CHECK-NEXT: store i32 [[TMP0]], ptr [[PTR2]], align 4
21
21
; CHECK-NEXT: br label [[IF_END]]
22
22
; CHECK: if.end:
@@ -56,4 +56,112 @@ exit: ; preds = %if.end, %entry
56
56
ret void
57
57
}
58
58
59
+ define void @f_nofree_nosync (i32 %ptr_i , ptr %ptr2 , i1 %cond ) nofree nosync {
60
+ ; CHECK-LABEL: @f_nofree_nosync(
61
+ ; CHECK-NEXT: entry:
62
+ ; CHECK-NEXT: [[PTR:%.*]] = inttoptr i32 [[PTR_I:%.*]] to ptr
63
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR]], i32 16), "dereferenceable"(ptr [[PTR]], i32 16) ]
64
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[FOR_BODY_LR_PH:%.*]], label [[IF0:%.*]]
65
+ ; CHECK: if0:
66
+ ; CHECK-NEXT: store i32 0, ptr [[PTR2:%.*]], align 4
67
+ ; CHECK-NEXT: br label [[FOR_BODY_LR_PH]]
68
+ ; CHECK: for.body.lr.ph:
69
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
70
+ ; CHECK: for.body:
71
+ ; CHECK-NEXT: [[I_08:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]
72
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_END]], label [[IF:%.*]]
73
+ ; CHECK: if:
74
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR]], align 4, !invariant.load [[META0]]
75
+ ; CHECK-NEXT: store i32 [[TMP0]], ptr [[PTR2]], align 4
76
+ ; CHECK-NEXT: br label [[IF_END]]
77
+ ; CHECK: if.end:
78
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_08]], 1
79
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC]], 2
80
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[EXIT:%.*]]
81
+ ; CHECK: exit:
82
+ ; CHECK-NEXT: ret void
83
+ ;
84
+ entry:
85
+ %ptr = inttoptr i32 %ptr_i to ptr
86
+ call void @llvm.assume (i1 true ) [ "align" (ptr %ptr , i32 16 ), "dereferenceable" (ptr %ptr , i32 16 ) ]
87
+ br i1 %cond , label %for.body.lr.ph , label %if0
88
+
89
+ if0:
90
+ store i32 0 , ptr %ptr2 , align 4
91
+ br label %for.body.lr.ph
92
+
93
+ for.body.lr.ph: ; preds = %entry
94
+ br label %for.body
95
+
96
+ for.body: ; preds = %for.body.lr.ph, %if.end
97
+ %i.08 = phi i32 [ 0 , %for.body.lr.ph ], [ %inc , %if.end ]
98
+ br i1 %cond , label %if.end , label %if
99
+
100
+ if:
101
+ %0 = load i32 , ptr %ptr , align 4 , !invariant.load !{}
102
+ store i32 %0 , ptr %ptr2 , align 4
103
+ br label %if.end
104
+
105
+ if.end: ; preds = %for.body
106
+ %inc = add nuw nsw i32 %i.08 , 1
107
+ %cmp = icmp slt i32 %inc , 2
108
+ br i1 %cmp , label %for.body , label %exit
109
+
110
+ exit: ; preds = %if.end, %entry
111
+ ret void
112
+ }
113
+
114
+ define void @f_without_ptrtoint_and_with_nofree_nosync (ptr %ptr , ptr %ptr2 , i1 %cond ) nofree nosync {
115
+ ; CHECK-LABEL: @f_without_ptrtoint_and_with_nofree_nosync(
116
+ ; CHECK-NEXT: entry:
117
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[PTR:%.*]], i32 16), "dereferenceable"(ptr [[PTR]], i32 16) ]
118
+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[FOR_BODY_LR_PH:%.*]], label [[IF0:%.*]]
119
+ ; CHECK: if0:
120
+ ; CHECK-NEXT: store i32 0, ptr [[PTR2:%.*]], align 4
121
+ ; CHECK-NEXT: br label [[FOR_BODY_LR_PH]]
122
+ ; CHECK: for.body.lr.ph:
123
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR]], align 4
124
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
125
+ ; CHECK: for.body:
126
+ ; CHECK-NEXT: [[I_08:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]
127
+ ; CHECK-NEXT: br i1 [[COND]], label [[IF_END]], label [[IF:%.*]]
128
+ ; CHECK: if:
129
+ ; CHECK-NEXT: store i32 [[TMP0]], ptr [[PTR2]], align 4
130
+ ; CHECK-NEXT: br label [[IF_END]]
131
+ ; CHECK: if.end:
132
+ ; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_08]], 1
133
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC]], 2
134
+ ; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[EXIT:%.*]]
135
+ ; CHECK: exit:
136
+ ; CHECK-NEXT: ret void
137
+ ;
138
+ entry:
139
+ call void @llvm.assume (i1 true ) [ "align" (ptr %ptr , i32 16 ), "dereferenceable" (ptr %ptr , i32 16 ) ]
140
+ br i1 %cond , label %for.body.lr.ph , label %if0
141
+
142
+ if0:
143
+ store i32 0 , ptr %ptr2 , align 4
144
+ br label %for.body.lr.ph
145
+
146
+ for.body.lr.ph: ; preds = %entry
147
+ br label %for.body
148
+
149
+ for.body: ; preds = %for.body.lr.ph, %if.end
150
+ %i.08 = phi i32 [ 0 , %for.body.lr.ph ], [ %inc , %if.end ]
151
+ br i1 %cond , label %if.end , label %if
152
+
153
+ if:
154
+ %0 = load i32 , ptr %ptr , align 4 , !invariant.load !{}
155
+ store i32 %0 , ptr %ptr2 , align 4
156
+ br label %if.end
157
+
158
+ if.end: ; preds = %for.body
159
+ %inc = add nuw nsw i32 %i.08 , 1
160
+ %cmp = icmp slt i32 %inc , 2
161
+ br i1 %cmp , label %for.body , label %exit
162
+
163
+ exit: ; preds = %if.end, %entry
164
+ ret void
165
+ }
166
+
59
167
declare void @llvm.assume (i1 noundef)
0 commit comments