<html><body><p><font size="2">> </font><tt><font size="2">Nitpick: what's allyesconfig?</font></tt><br><br><font size="2">Hi Roman,</font><br><font size="2"><br>I actually don't know what is allyesconfig. </font><br><font size="2"><br>nathanchance posted on </font><a href="https://reviews.llvm.org/D80477"><u><font size="2" color="#0000FF">https://reviews.llvm.org/D80477</font></u></a><font size="2">, saying my previous patch causes a crash in the Linux kernel when building s390 allyesconfig.</font><br><font size="2"><br>Regards,<br>Whitney Tsang</font><br><br><img width="16" height="16" src="cid:1__=8FBB0FEBDFE1B62B8f9e8a93df938690918c8FB@" border="0" alt="Inactive hide details for Roman Lebedev ---2020/05/30 04:36:37 PM---On Sat, May 30, 2020 at 11:34 PM Whitney Tsang via llvm-com"><font size="2" color="#424282">Roman Lebedev ---2020/05/30 04:36:37 PM---On Sat, May 30, 2020 at 11:34 PM Whitney Tsang via llvm-commits <llvm-commits@lists.llvm.org> wrote:</font><br><br><font size="2" color="#5F5F5F">From:        </font><font size="2">Roman Lebedev <lebedev.ri@gmail.com></font><br><font size="2" color="#5F5F5F">To:        </font><font size="2">Whitney Tsang <whitneyt@ca.ibm.com>, Whitney Tsang <llvmlistbot@llvm.org></font><br><font size="2" color="#5F5F5F">Cc:        </font><font size="2">llvm-commits@lists.llvm.org</font><br><font size="2" color="#5F5F5F">Date:        </font><font size="2">2020/05/30 04:36 PM</font><br><font size="2" color="#5F5F5F">Subject:        </font><font size="2">[EXTERNAL] Re: [llvm] 0fee91a - [LoopUnroll] Add a test case for rG7873376bb36b.</font><br><hr width="100%" size="2" align="left" noshade style="color:#8091A5; "><br><br><br><tt><font size="2">On Sat, May 30, 2020 at 11:34 PM Whitney Tsang via llvm-commits<br><llvm-commits@lists.llvm.org> wrote:<br>><br>><br>> Author: Whitney Tsang<br>> Date: 2020-05-30T20:34:27Z<br>> New Revision: 0fee91a187d98ad68d70fb42dad4451fce172a23<br>><br>> URL: </font></tt><tt><font size="2"><a href="https://github.com/llvm/llvm-project/commit/0fee91a187d98ad68d70fb42dad4451fce172a23">https://github.com/llvm/llvm-project/commit/0fee91a187d98ad68d70fb42dad4451fce172a23</a></font></tt><tt><font size="2"> <br>> DIFF: </font></tt><tt><font size="2"><a href="https://github.com/llvm/llvm-project/commit/0fee91a187d98ad68d70fb42dad4451fce172a23.diff">https://github.com/llvm/llvm-project/commit/0fee91a187d98ad68d70fb42dad4451fce172a23.diff</a></font></tt><tt><font size="2"> <br>><br>> LOG: [LoopUnroll] Add a test case for rG7873376bb36b.<br>><br>> rG7873376bb36b fixes a build failure for allyesconfig.<br>Nitpick: what's allyesconfig?<br><br>> The problem happened when the single exiting block doesn't dominate the<br>> loop latch, then the immediate dominator of the exit block should not be<br>> the exiting block after unrolling. As the exiting block of<br>> different unrolled iteration can branch to the exit block, and the ith<br>> exiting block doesn't dominate (i+1)th exiting block, the immediate<br>> dominator of the exit block should not the nearest common dominator of<br>> the exiting block and the loop latch of the same iteration.<br>><br>> Differential Revision: </font></tt><tt><font size="2"><a href="https://reviews.llvm.org/D80477">https://reviews.llvm.org/D80477</a></font></tt><tt><font size="2"> <br>><br>> Added:<br>><br>><br>> Modified:<br>>     llvm/test/Transforms/LoopUnroll/nonlatchcondbr.ll<br>><br>> Removed:<br>><br>><br>><br>> ################################################################################<br>> diff  --git a/llvm/test/Transforms/LoopUnroll/nonlatchcondbr.ll b/llvm/test/Transforms/LoopUnroll/nonlatchcondbr.ll<br>> index 547b05d1e186..351f3faf7ce8 100644<br>> --- a/llvm/test/Transforms/LoopUnroll/nonlatchcondbr.ll<br>> +++ b/llvm/test/Transforms/LoopUnroll/nonlatchcondbr.ll<br>> @@ -1,9 +1,12 @@<br>>  ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>> -; RUN: opt < %s -loop-unroll -S | FileCheck %s<br>> -; RUN: opt < %s -passes='require<opt-remark-emit>,unroll' -S | FileCheck %s<br>> +; RUN: opt < %s -loop-unroll -unroll-runtime -unroll-count=4 -S | FileCheck %s<br>> +; RUN: opt < %s -passes='require<opt-remark-emit>,unroll' -unroll-runtime -unroll-count=4 -S | FileCheck %s<br>><br>> -define void @foo(i32* noalias %A) {<br>> -; CHECK-LABEL: @foo(<br>> +; Check that loop unroll pass correctly handle loops with<br>> +; single exiting block not the loop header or latch.<br>> +<br>> +define void @test1(i32* noalias %A) {<br>> +; CHECK-LABEL: @test1(<br>>  ; CHECK-NEXT:  entry:<br>>  ; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A:%.*]], align 4<br>>  ; CHECK-NEXT:    call void @bar(i32 [[TMP0]])<br>> @@ -66,4 +69,91 @@ for.end:<br>>    ret void<br>>  }<br>><br>> +; Check that loop unroll pass correctly handle loops with<br>> +; (1) exiting block not dominating the loop latch; and<br>> +; (2) exiting terminator instructions cannot be simplified to unconditional.<br>> +<br>> +define void @test2(i32* noalias %A) {<br>> +; CHECK-LABEL: @test2(<br>> +; CHECK-NEXT:  entry:<br>> +; CHECK-NEXT:    br i1 true, label [[FOR_PREHEADER:%.*]], label [[FOR_END:%.*]]<br>> +; CHECK:       for.preheader:<br>> +; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A:%.*]], align 4<br>> +; CHECK-NEXT:    call void @bar(i32 [[TMP0]])<br>> +; CHECK-NEXT:    br label [[FOR_HEADER:%.*]]<br>> +; CHECK:       for.header:<br>> +; CHECK-NEXT:    [[TMP1:%.*]] = phi i32 [ [[TMP0]], [[FOR_PREHEADER]] ], [ [[DOTPRE_3:%.*]], [[FOR_BODY_FOR_BODY_CRIT_EDGE_3:%.*]] ]<br>> +; CHECK-NEXT:    [[I:%.*]] = phi i64 [ 0, [[FOR_PREHEADER]] ], [ [[INC_3:%.*]], [[FOR_BODY_FOR_BODY_CRIT_EDGE_3]] ]<br>> +; CHECK-NEXT:    call void @bar(i32 [[TMP1]])<br>> +; CHECK-NEXT:    [[INC:%.*]] = add nuw nsw i64 [[I]], 1<br>> +; CHECK-NEXT:    br i1 true, label [[FOR_BODY:%.*]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE:%.*]]<br>> +; CHECK:       for.body:<br>> +; CHECK-NEXT:    [[CMP:%.*]] = call i1 @foo(i64 [[I]])<br>> +; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE]], label [[FOR_END_LOOPEXIT:%.*]]<br>> +; CHECK:       for.body.for.body_crit_edge:<br>> +; CHECK-NEXT:    [[ARRAYIDX_PHI_TRANS_INSERT:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INC]]<br>> +; CHECK-NEXT:    [[DOTPRE:%.*]] = load i32, i32* [[ARRAYIDX_PHI_TRANS_INSERT]], align 4<br>> +; CHECK-NEXT:    call void @bar(i32 [[DOTPRE]])<br>> +; CHECK-NEXT:    [[INC_1:%.*]] = add nuw nsw i64 [[INC]], 1<br>> +; CHECK-NEXT:    br i1 true, label [[FOR_BODY_1:%.*]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE_1:%.*]]<br>> +; CHECK:       for.end.loopexit:<br>> +; CHECK-NEXT:    br label [[FOR_END]]<br>> +; CHECK:       for.end:<br>> +; CHECK-NEXT:    ret void<br>> +; CHECK:       for.body.1:<br>> +; CHECK-NEXT:    [[CMP_1:%.*]] = call i1 @foo(i64 [[INC]])<br>> +; CHECK-NEXT:    br i1 [[CMP_1]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE_1]], label [[FOR_END_LOOPEXIT]]<br>> +; CHECK:       for.body.for.body_crit_edge.1:<br>> +; CHECK-NEXT:    [[ARRAYIDX_PHI_TRANS_INSERT_1:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INC_1]]<br>> +; CHECK-NEXT:    [[DOTPRE_1:%.*]] = load i32, i32* [[ARRAYIDX_PHI_TRANS_INSERT_1]], align 4<br>> +; CHECK-NEXT:    call void @bar(i32 [[DOTPRE_1]])<br>> +; CHECK-NEXT:    [[INC_2:%.*]] = add nuw nsw i64 [[INC_1]], 1<br>> +; CHECK-NEXT:    br i1 true, label [[FOR_BODY_2:%.*]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE_2:%.*]]<br>> +; CHECK:       for.body.2:<br>> +; CHECK-NEXT:    [[CMP_2:%.*]] = call i1 @foo(i64 [[INC_1]])<br>> +; CHECK-NEXT:    br i1 [[CMP_2]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE_2]], label [[FOR_END_LOOPEXIT]]<br>> +; CHECK:       for.body.for.body_crit_edge.2:<br>> +; CHECK-NEXT:    [[ARRAYIDX_PHI_TRANS_INSERT_2:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INC_2]]<br>> +; CHECK-NEXT:    [[DOTPRE_2:%.*]] = load i32, i32* [[ARRAYIDX_PHI_TRANS_INSERT_2]], align 4<br>> +; CHECK-NEXT:    call void @bar(i32 [[DOTPRE_2]])<br>> +; CHECK-NEXT:    [[INC_3]] = add nsw i64 [[INC_2]], 1<br>> +; CHECK-NEXT:    br i1 true, label [[FOR_BODY_3:%.*]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE_3]]<br>> +; CHECK:       for.body.3:<br>> +; CHECK-NEXT:    [[CMP_3:%.*]] = call i1 @foo(i64 [[INC_2]])<br>> +; CHECK-NEXT:    br i1 [[CMP_3]], label [[FOR_BODY_FOR_BODY_CRIT_EDGE_3]], label [[FOR_END_LOOPEXIT]]<br>> +; CHECK:       for.body.for.body_crit_edge.3:<br>> +; CHECK-NEXT:    [[ARRAYIDX_PHI_TRANS_INSERT_3:%.*]] = getelementptr inbounds i32, i32* [[A]], i64 [[INC_3]]<br>> +; CHECK-NEXT:    [[DOTPRE_3]] = load i32, i32* [[ARRAYIDX_PHI_TRANS_INSERT_3]], align 4<br>> +; CHECK-NEXT:    br label [[FOR_HEADER]], !llvm.loop !0<br>> +;<br>> +entry:<br>> +  br i1 true, label %for.preheader, label %for.end<br>> +<br>> +for.preheader:<br>> +  %0 = load i32, i32* %A, align 4<br>> +  call void @bar(i32 %0)<br>> +  br label %for.header<br>> +<br>> +for.header:<br>> +  %1 = phi i32 [ %0, %for.preheader ], [ %.pre, %for.body.for.body_crit_edge ]<br>> +  %i = phi i64 [ 0, %for.preheader ], [ %inc, %for.body.for.body_crit_edge ]<br>> +  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i<br>> +  call void @bar(i32 %1)<br>> +  %inc = add nsw i64 %i, 1<br>> +  br i1 true, label %for.body, label %for.body.for.body_crit_edge<br>> +<br>> +for.body:<br>> +  %cmp = call i1 @foo(i64 %i)<br>> +  br i1 %cmp, label %for.body.for.body_crit_edge, label %for.end<br>> +<br>> +for.body.for.body_crit_edge:<br>> +  %arrayidx.phi.trans.insert = getelementptr inbounds i32, i32* %A, i64 %inc<br>> +  %.pre = load i32, i32* %arrayidx.phi.trans.insert, align 4<br>> +  br label %for.header<br>> +<br>> +for.end:<br>> +  ret void<br>> +}<br>> +<br>>  declare void @bar(i32)<br>> +declare i1 @foo(i64)<br>><br>><br>><br>> _______________________________________________<br>> llvm-commits mailing list<br>> llvm-commits@lists.llvm.org<br>> </font></tt><tt><font size="2"><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a></font></tt><tt><font size="2"> <br><br></font></tt><br><br><BR>
</body></html>