<div dir="ltr">oops, I'll be careful next time</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Mar 16, 2020 at 12:15 PM Philip Reames via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">minor: past tense of freeze is frozen, not freezed.<br>
<br>
On 3/14/20 7:10 PM, Juneyoung Lee via llvm-commits wrote:<br>
> Author: Juneyoung Lee<br>
> Date: 2020-03-15T11:10:46+09:00<br>
> New Revision: 10aa7ea951e22dbd7f2ebdeb6410cfbc8a251eb1<br>
><br>
> URL: <a href="https://github.com/llvm/llvm-project/commit/10aa7ea951e22dbd7f2ebdeb6410cfbc8a251eb1" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/10aa7ea951e22dbd7f2ebdeb6410cfbc8a251eb1</a><br>
> DIFF: <a href="https://github.com/llvm/llvm-project/commit/10aa7ea951e22dbd7f2ebdeb6410cfbc8a251eb1.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/10aa7ea951e22dbd7f2ebdeb6410cfbc8a251eb1.diff</a><br>
><br>
> LOG: [CodeGenPrepare] Freeze condition when transforming select to br<br>
><br>
> Summary:<br>
> This is a simple fix for CodeGenPrepare that freezes branch condition when transforming select to branch.<br>
> If it is not freezed, instsimplify or the later pipeline can potentially exploit undefined behavior.<br>
><br>
> The diff shows optimized form becase D75859 and D76048 already made a few changes to CodeGenPrepare for optimizing freeze(cmp).<br>
><br>
> Reviewers: jdoerfert, spatel, lebedev.ri, efriedma<br>
><br>
> Reviewed By: lebedev.ri<br>
><br>
> Subscribers: hiraditya, llvm-commits<br>
><br>
> Tags: #llvm<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D76179" rel="noreferrer" target="_blank">https://reviews.llvm.org/D76179</a><br>
><br>
> Added:<br>
>      <br>
><br>
> Modified:<br>
>      llvm/lib/CodeGen/CodeGenPrepare.cpp<br>
>      llvm/test/CodeGen/ARM/2012-08-30-select.ll<br>
>      llvm/test/Transforms/CodeGenPrepare/X86/optimizeSelect-DT.ll<br>
>      llvm/test/Transforms/CodeGenPrepare/X86/select.ll<br>
><br>
> Removed:<br>
>      <br>
><br>
><br>
> ################################################################################<br>
> diff  --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp<br>
> index 373064da7bb8..fd55ef2936b0 100644<br>
> --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp<br>
> +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp<br>
> @@ -6131,7 +6131,8 @@ bool CodeGenPrepare::optimizeSelectInst(SelectInst *SI) {<br>
>     // Into:<br>
>     //    start:<br>
>     //       %cmp = cmp uge i32 %a, %b<br>
> -  //       br i1 %cmp, label %select.true, label %select.false<br>
> +  //       %cmp.frozen = freeze %cmp<br>
> +  //       br i1 %cmp.frozen, label %select.true, label %select.false<br>
>     //    select.true:<br>
>     //       br label %select.end<br>
>     //    select.false:<br>
> @@ -6139,6 +6140,7 @@ bool CodeGenPrepare::optimizeSelectInst(SelectInst *SI) {<br>
>     //    select.end:<br>
>     //       %sel = phi i32 [ %c, %select.true ], [ %d, %select.false ]<br>
>     //<br>
> +  // %cmp should be freezed, otherwise it may introduce undefined behavior.<br>
>     // In addition, we may sink instructions that produce %c or %d from<br>
>     // the entry block into the destination(s) of the new branch.<br>
>     // If the true or false blocks do not contain a sunken instruction, that<br>
> @@ -6217,7 +6219,9 @@ bool CodeGenPrepare::optimizeSelectInst(SelectInst *SI) {<br>
>       TT = TrueBlock;<br>
>       FT = FalseBlock;<br>
>     }<br>
> -  IRBuilder<>(SI).CreateCondBr(SI->getCondition(), TT, FT, SI);<br>
> +  IRBuilder<> IB(SI);<br>
> +  auto CondFr = IB.CreateFreeze(SI->getCondition(), SI->getName() + ".frozen");<br>
> +  IB.CreateCondBr(CondFr, TT, FT, SI);<br>
>   <br>
>     SmallPtrSet<const Instruction *, 2> INS;<br>
>     INS.insert(ASI.begin(), ASI.end());<br>
><br>
> diff  --git a/llvm/test/CodeGen/ARM/2012-08-30-select.ll b/llvm/test/CodeGen/ARM/2012-08-30-select.ll<br>
> index 97b732beb4d7..b51688702a54 100644<br>
> --- a/llvm/test/CodeGen/ARM/2012-08-30-select.ll<br>
> +++ b/llvm/test/CodeGen/ARM/2012-08-30-select.ll<br>
> @@ -2,9 +2,9 @@<br>
>   ; rdar://12201387<br>
>   <br>
>   ;CHECK-LABEL: select_s_v_v:<br>
> +;CHECK: vmov.i32<br>
>   ;CHECK: vmov<br>
>   ;CHECK-NEXT: vmov<br>
> -;CHECK: vmov.i32<br>
>   ;CHECK: bx<br>
>   define <16 x i8> @select_s_v_v(<16 x i8> %vec, i32 %avail) {<br>
>   entry:<br>
><br>
> diff  --git a/llvm/test/Transforms/CodeGenPrepare/X86/optimizeSelect-DT.ll b/llvm/test/Transforms/CodeGenPrepare/X86/optimizeSelect-DT.ll<br>
> index 05389bfe8d0a..eb4e4ce431af 100644<br>
> --- a/llvm/test/Transforms/CodeGenPrepare/X86/optimizeSelect-DT.ll<br>
> +++ b/llvm/test/Transforms/CodeGenPrepare/X86/optimizeSelect-DT.ll<br>
> @@ -7,7 +7,8 @@ target triple = "x86_64-unknown-linux-gnu"<br>
>   define i1 @PR41004(i32 %x, i32 %y, i32 %t1) {<br>
>   ; CHECK-LABEL: @PR41004(<br>
>   ; CHECK-NEXT:  entry:<br>
> -; CHECK-NEXT:    [[T0:%.*]] = icmp eq i32 [[Y:%.*]], 1<br>
> +; CHECK-NEXT:    [[MUL_FR:%.*]] = freeze i32 [[Y:%.*]]<br>
> +; CHECK-NEXT:    [[T0:%.*]] = icmp eq i32 [[MUL_FR]], 1<br>
>   ; CHECK-NEXT:    br i1 [[T0]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END:%.*]]<br>
>   ; CHECK:       select.true.sink:<br>
>   ; CHECK-NEXT:    [[REM:%.*]] = srem i32 [[X:%.*]], 2<br>
><br>
> diff  --git a/llvm/test/Transforms/CodeGenPrepare/X86/select.ll b/llvm/test/Transforms/CodeGenPrepare/X86/select.ll<br>
> index 7829376e9db1..390794ab3cda 100644<br>
> --- a/llvm/test/Transforms/CodeGenPrepare/X86/select.ll<br>
> +++ b/llvm/test/Transforms/CodeGenPrepare/X86/select.ll<br>
> @@ -27,7 +27,8 @@ entry:<br>
>   define float @fdiv_true_sink(float %a, float %b) {<br>
>   ; CHECK-LABEL: @fdiv_true_sink(<br>
>   ; CHECK-NEXT:  entry:<br>
> -; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[A:%.*]], 1.000000e+00<br>
> +; CHECK-NEXT:    [[SEL_FR:%.*]] = freeze float [[A:%.*]]<br>
> +; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[SEL_FR]], 1.000000e+00<br>
>   ; CHECK-NEXT:    br i1 [[CMP]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END:%.*]]<br>
>   ; CHECK:       select.true.sink:<br>
>   ; CHECK-NEXT:    [[DIV:%.*]] = fdiv float [[A]], [[B:%.*]]<br>
> @@ -38,7 +39,8 @@ define float @fdiv_true_sink(float %a, float %b) {<br>
>   ;<br>
>   ; DEBUG-LABEL: @fdiv_true_sink(<br>
>   ; DEBUG-NEXT:  entry:<br>
> -; DEBUG-NEXT:    [[CMP:%.*]] = fcmp ogt float [[A:%.*]], 1.000000e+00<br>
> +; DEBUG-NEXT:    [[SEL_FR:%.*]] = freeze float [[A:%.*]]<br>
> +; DEBUG-NEXT:    [[CMP:%.*]] = fcmp ogt float [[SEL_FR]], 1.000000e+00, !dbg !24<br>
>   ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i1 [[CMP]]<br>
>   ; DEBUG-NEXT:    br i1 [[CMP]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_END:%.*]], !dbg<br>
>   ; DEBUG:       select.true.sink:<br>
> @@ -60,7 +62,8 @@ entry:<br>
>   define float @fdiv_false_sink(float %a, float %b) {<br>
>   ; CHECK-LABEL: @fdiv_false_sink(<br>
>   ; CHECK-NEXT:  entry:<br>
> -; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[A:%.*]], 3.000000e+00<br>
> +; CHECK-NEXT:    [[SEL_FR:%.*]] = freeze float [[A:%.*]]<br>
> +; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[SEL_FR]], 3.000000e+00<br>
>   ; CHECK-NEXT:    br i1 [[CMP]], label [[SELECT_END:%.*]], label [[SELECT_FALSE_SINK:%.*]]<br>
>   ; CHECK:       select.false.sink:<br>
>   ; CHECK-NEXT:    [[DIV:%.*]] = fdiv float [[A]], [[B:%.*]]<br>
> @@ -71,7 +74,8 @@ define float @fdiv_false_sink(float %a, float %b) {<br>
>   ;<br>
>   ; DEBUG-LABEL: @fdiv_false_sink(<br>
>   ; DEBUG-NEXT:  entry:<br>
> -; DEBUG-NEXT:    [[CMP:%.*]] = fcmp ogt float [[A:%.*]], 3.000000e+00<br>
> +; DEBUG-NEXT:    [[SEL_FR:%.*]] = freeze float [[A:%.*]]<br>
> +; DEBUG-NEXT:    [[CMP:%.*]] = fcmp ogt float [[SEL_FR]], 3.000000e+00, !dbg !33<br>
>   ; DEBUG-NEXT:    call void @llvm.dbg.value(metadata i1 [[CMP]]<br>
>   ; DEBUG-NEXT:    br i1 [[CMP]], label [[SELECT_END:%.*]], label [[SELECT_FALSE_SINK:%.*]], !dbg<br>
>   ; DEBUG:       select.false.sink:<br>
> @@ -93,7 +97,8 @@ entry:<br>
>   define float @fdiv_both_sink(float %a, float %b) {<br>
>   ; CHECK-LABEL: @fdiv_both_sink(<br>
>   ; CHECK-NEXT:  entry:<br>
> -; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[A:%.*]], 5.000000e+00<br>
> +; CHECK-NEXT:    [[SEL_FR:%.*]] = freeze float [[A:%.*]]<br>
> +; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[SEL_FR]], 5.000000e+00<br>
>   ; CHECK-NEXT:    br i1 [[CMP]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_FALSE_SINK:%.*]]<br>
>   ; CHECK:       select.true.sink:<br>
>   ; CHECK-NEXT:    [[DIV1:%.*]] = fdiv float [[A]], [[B:%.*]]<br>
><br>
><br>
>          <br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><br></div><font size="1">Juneyoung Lee</font><div><font size="1">Software Foundation Lab, Seoul National University</font></div></div></div>