@@ -34,8 +34,9 @@ define void @test1(ptr noalias nocapture %a, ptr noalias nocapture readonly %b)
3434; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1600
3535; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
3636; CHECK: [[MIDDLE_BLOCK]]:
37- ; CHECK-NEXT: br [[FOR_END:label %.*]]
38- ; CHECK: [[SCALAR_PH:.*:]]
37+ ; CHECK-NEXT: br label %[[FOR_END:.*]]
38+ ; CHECK: [[FOR_END]]:
39+ ; CHECK-NEXT: ret void
3940;
4041entry:
4142 br label %for.body
@@ -57,10 +58,6 @@ for.end: ; preds = %for.body
5758 ret void
5859}
5960
60- declare void @llvm.assume (i1 ) #0
61-
62- attributes #0 = { nounwind willreturn }
63-
6461define void @test2 (ptr noalias %a , ptr noalias %b ) {
6562; CHECK-LABEL: define void @test2(
6663; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {
@@ -92,10 +89,11 @@ define void @test2(ptr noalias %a, ptr noalias %b) {
9289; CHECK-NEXT: store <2 x float> [[TMP6]], ptr [[TMP8]], align 4
9390; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
9491; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1600
95- ; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4 :![0-9]+]]
92+ ; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3 :![0-9]+]]
9693; CHECK: [[MIDDLE_BLOCK]]:
97- ; CHECK-NEXT: br [[FOR_END:label %.*]]
98- ; CHECK: [[SCALAR_PH:.*:]]
94+ ; CHECK-NEXT: br label %[[FOR_END:.*]]
95+ ; CHECK: [[FOR_END]]:
96+ ; CHECK-NEXT: ret void
9997;
10098entry:
10199 %ptrint = ptrtoint ptr %a to i64
@@ -163,7 +161,7 @@ define void @predicated_assume(ptr noalias nocapture readonly %a, ptr noalias no
163161; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
164162; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i64> [[STEP_ADD]], splat (i64 2)
165163; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
166- ; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6 :![0-9]+]]
164+ ; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4 :![0-9]+]]
167165; CHECK: [[MIDDLE_BLOCK]]:
168166; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]]
169167; CHECK-NEXT: br i1 [[CMP_N]], [[FOR_COND_CLEANUP_LOOPEXIT:label %.*]], label %[[SCALAR_PH]]
@@ -204,3 +202,58 @@ if.end5: ; preds = %for.body, %if.else
204202 %cmp = icmp eq i64 %indvars.iv.next , %0
205203 br i1 %cmp , label %for.cond.cleanup.loopexit , label %for.body
206204}
205+
206+ define void @operand_bundle (ptr noalias %a , ptr noalias %b ) {
207+ ; CHECK-LABEL: define void @operand_bundle(
208+ ; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {
209+ ; CHECK-NEXT: [[ENTRY:.*:]]
210+ ; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
211+ ; CHECK: [[VECTOR_PH]]:
212+ ; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
213+ ; CHECK: [[VECTOR_BODY]]:
214+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
215+ ; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
216+ ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 1
217+ ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[INDEX]], 2
218+ ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[INDEX]], 3
219+ ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds float, ptr [[B]], i64 [[TMP0]]
220+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds float, ptr [[TMP4]], i32 2
221+ ; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x float>, ptr [[TMP4]], align 4
222+ ; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <2 x float>, ptr [[TMP5]], align 4
223+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 [[TMP0]]) ]
224+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 [[TMP1]]) ]
225+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 [[TMP2]]) ]
226+ ; CHECK-NEXT: tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i64 [[TMP3]]) ]
227+ ; CHECK-NEXT: [[TMP6:%.*]] = fadd <2 x float> [[WIDE_LOAD]], splat (float 1.000000e+00)
228+ ; CHECK-NEXT: [[TMP7:%.*]] = fadd <2 x float> [[WIDE_LOAD1]], splat (float 1.000000e+00)
229+ ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP0]]
230+ ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds float, ptr [[TMP8]], i32 2
231+ ; CHECK-NEXT: store <2 x float> [[TMP6]], ptr [[TMP8]], align 4
232+ ; CHECK-NEXT: store <2 x float> [[TMP7]], ptr [[TMP9]], align 4
233+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
234+ ; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1600
235+ ; CHECK-NEXT: br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
236+ ; CHECK: [[MIDDLE_BLOCK]]:
237+ ; CHECK-NEXT: br label %[[FOR_END:.*]]
238+ ; CHECK: [[FOR_END]]:
239+ ; CHECK-NEXT: ret void
240+ ;
241+ entry:
242+ br label %for.body
243+
244+ for.body: ; preds = %for.body, %entry
245+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %for.body ]
246+ %arrayidx = getelementptr inbounds float , ptr %b , i64 %iv
247+ %0 = load float , ptr %arrayidx , align 4
248+ %cmp1 = fcmp ogt float %0 , 1 .000000e+02
249+ tail call void @llvm.assume (i1 true ) ["align" (ptr %a , i64 %iv )]
250+ %add = fadd float %0 , 1 .000000e+00
251+ %arrayidx5 = getelementptr inbounds float , ptr %a , i64 %iv
252+ store float %add , ptr %arrayidx5 , align 4
253+ %iv.next = add nuw nsw i64 %iv , 1
254+ %exitcond = icmp eq i64 %iv , 1599
255+ br i1 %exitcond , label %for.end , label %for.body
256+
257+ for.end: ; preds = %for.body
258+ ret void
259+ }
0 commit comments