98 lines · plain
1; RUN: opt -S -passes='loop-versioning-licm' -licm-versioning-invariant-threshold=0 %s | FileCheck %s2 3; Make sure the convergent attribute is respected, and no condition is4; introduced5 6; CHECK-LABEL: @test_convergent(7; CHECK: call void @llvm.convergent()8; CHECK-NOT: call void @llvm.convergent()9define i32 @test_convergent(ptr nocapture %var1, ptr nocapture readnone %var2, ptr nocapture %var3, i32 %itr) #1 {10entry:11 %cmp14 = icmp eq i32 %itr, 012 br i1 %cmp14, label %for.end13, label %for.cond1.preheader13 14for.cond1.preheader: ; preds = %entry, %for.inc1115 %j.016 = phi i32 [ %j.1.lcssa, %for.inc11 ], [ 0, %entry ]16 %i.015 = phi i32 [ %inc12, %for.inc11 ], [ 0, %entry ]17 %cmp212 = icmp ult i32 %j.016, %itr18 br i1 %cmp212, label %for.body3.lr.ph, label %for.inc1119 20for.body3.lr.ph: ; preds = %for.cond1.preheader21 %add = add i32 %i.015, %itr22 %idxprom6 = zext i32 %i.015 to i6423 %arrayidx7 = getelementptr inbounds i32, ptr %var3, i64 %idxprom624 br label %for.body325 26for.body3: ; preds = %for.body3, %for.body3.lr.ph27 %j.113 = phi i32 [ %j.016, %for.body3.lr.ph ], [ %inc, %for.body3 ]28 %idxprom = zext i32 %j.113 to i6429 %arrayidx = getelementptr inbounds i32, ptr %var1, i64 %idxprom30 store i32 %add, ptr %arrayidx, align 431 %load.arrayidx7 = load i32, ptr %arrayidx7, align 432 call void @llvm.convergent()33 %add8 = add nsw i32 %load.arrayidx7, %add34 store i32 %add8, ptr %arrayidx7, align 435 %inc = add nuw i32 %j.113, 136 %cmp2 = icmp ult i32 %inc, %itr37 br i1 %cmp2, label %for.body3, label %for.inc1138 39for.inc11: ; preds = %for.body3, %for.cond1.preheader40 %j.1.lcssa = phi i32 [ %j.016, %for.cond1.preheader ], [ %itr, %for.body3 ]41 %inc12 = add nuw i32 %i.015, 142 %cmp = icmp ult i32 %inc12, %itr43 br i1 %cmp, label %for.cond1.preheader, label %for.end1344 45for.end13: ; preds = %for.inc11, %entry46 ret i32 047}48 49; CHECK-LABEL: @test_noduplicate(50; CHECK: call void @llvm.noduplicate()51; CHECK-NOT: call void @llvm.noduplicate()52define i32 @test_noduplicate(ptr nocapture %var1, ptr nocapture readnone %var2, ptr nocapture %var3, i32 %itr) #2 {53entry:54 %cmp14 = icmp eq i32 %itr, 055 br i1 %cmp14, label %for.end13, label %for.cond1.preheader56 57for.cond1.preheader: ; preds = %entry, %for.inc1158 %j.016 = phi i32 [ %j.1.lcssa, %for.inc11 ], [ 0, %entry ]59 %i.015 = phi i32 [ %inc12, %for.inc11 ], [ 0, %entry ]60 %cmp212 = icmp ult i32 %j.016, %itr61 br i1 %cmp212, label %for.body3.lr.ph, label %for.inc1162 63for.body3.lr.ph: ; preds = %for.cond1.preheader64 %add = add i32 %i.015, %itr65 %idxprom6 = zext i32 %i.015 to i6466 %arrayidx7 = getelementptr inbounds i32, ptr %var3, i64 %idxprom667 br label %for.body368 69for.body3: ; preds = %for.body3, %for.body3.lr.ph70 %j.113 = phi i32 [ %j.016, %for.body3.lr.ph ], [ %inc, %for.body3 ]71 %idxprom = zext i32 %j.113 to i6472 %arrayidx = getelementptr inbounds i32, ptr %var1, i64 %idxprom73 store i32 %add, ptr %arrayidx, align 474 %load.arrayidx7 = load i32, ptr %arrayidx7, align 475 call void @llvm.noduplicate()76 %add8 = add nsw i32 %load.arrayidx7, %add77 store i32 %add8, ptr %arrayidx7, align 478 %inc = add nuw i32 %j.113, 179 %cmp2 = icmp ult i32 %inc, %itr80 br i1 %cmp2, label %for.body3, label %for.inc1181 82for.inc11: ; preds = %for.body3, %for.cond1.preheader83 %j.1.lcssa = phi i32 [ %j.016, %for.cond1.preheader ], [ %itr, %for.body3 ]84 %inc12 = add nuw i32 %i.015, 185 %cmp = icmp ult i32 %inc12, %itr86 br i1 %cmp, label %for.cond1.preheader, label %for.end1387 88for.end13: ; preds = %for.inc11, %entry89 ret i32 090}91 92declare void @llvm.convergent() #193declare void @llvm.noduplicate() #294 95attributes #0 = { norecurse nounwind }96attributes #1 = { norecurse nounwind readnone convergent }97attributes #2 = { norecurse nounwind readnone noduplicate }98