<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Sep 8, 2020 at 5:59 PM Philip Reames <<a href="mailto:listmail@philipreames.com">listmail@philipreames.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Given:<br>
<br>
x == 0 ? -abs(x) : Y<br>
<br>
We should really be producing:<br>
<br>
x == 0 ? 0 : Y<br>
<br>
This seems like something CVP might be able to handle, or even an <br>
alternate instcombine rule.<br>
<br>
And once we have<br>
<br>
x == 0 ? 0 : abs(x)<br>
<br>
We should definitely fold that to abs(x).<br>
<br>
Not suggesting that your change needs removed; just that there's an <br>
alternate, slightly more general way of achieving the same thing.<br>
<br>
Philip<br></blockquote><div><br></div><div>I agree that handling the pattern in this way would be ideal, but it's not entirely simple. I've put up <a href="https://reviews.llvm.org/D87480">https://reviews.llvm.org/D87480</a> as a first step. This is sufficient to fold x == 0 ? abs(x) : Y to x == 0 ? 0 : Y at least (but not negative abs).</div><div><br></div><div>Nikita<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

On 9/6/20 12:45 AM, Nikita Popov via llvm-commits wrote:<br>
> Author: Nikita Popov<br>
> Date: 2020-09-06T09:43:08+02:00<br>
> New Revision: ff218cbc84ff3783cb5ad030397adef8c9e8d444<br>
><br>
> URL: <a href="https://github.com/llvm/llvm-project/commit/ff218cbc84ff3783cb5ad030397adef8c9e8d444" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/ff218cbc84ff3783cb5ad030397adef8c9e8d444</a><br>
> DIFF: <a href="https://github.com/llvm/llvm-project/commit/ff218cbc84ff3783cb5ad030397adef8c9e8d444.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/ff218cbc84ff3783cb5ad030397adef8c9e8d444.diff</a><br>
><br>
> LOG: [InstSimplify] Fold degenerate abs of abs form<br>
><br>
> This addresses the remaining issue from D87188. Due to a series of<br>
> folds, we may end up with abs-of-abs represented as<br>
> x == 0 ? -abs(x) : abs(x). Rather than recognizing this as a special<br>
> abs pattern and doing an abs-of-abs fold on it afterwards,<br>
> I'm directly folding this to one of the select operands in InstSimplify.<br>
><br>
> The general pattern falls into the "select with operand replaced"<br>
> category, but that fold is not powerful enough to recognize that<br>
> both hands of the select are the same for value zero.<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D87197" rel="noreferrer" target="_blank">https://reviews.llvm.org/D87197</a><br>
><br>
> Added:<br>
>      <br>
><br>
> Modified:<br>
>      llvm/lib/Analysis/InstructionSimplify.cpp<br>
>      llvm/test/Transforms/InstSimplify/abs_intrinsic.ll<br>
><br>
> Removed:<br>
>      <br>
><br>
><br>
> ################################################################################<br>
> diff  --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp<br>
> index 3139b5a96b27..7c13b41bc7e6 100644<br>
> --- a/llvm/lib/Analysis/InstructionSimplify.cpp<br>
> +++ b/llvm/lib/Analysis/InstructionSimplify.cpp<br>
> @@ -3965,6 +3965,15 @@ static Value *simplifySelectWithICmpCond(Value *CondVal, Value *TrueVal,<br>
>       if (match(FalseVal, isRotate) && TrueVal == X && CmpLHS == ShAmt &&<br>
>           Pred == ICmpInst::ICMP_EQ)<br>
>         return FalseVal;<br>
> +<br>
> +    // X == 0 ? abs(X) : -abs(X) --> -abs(X)<br>
> +    // X == 0 ? -abs(X) : abs(X) --> abs(X)<br>
> +    if (match(TrueVal, m_Intrinsic<Intrinsic::abs>(m_Value(X))) &&<br>
> +        match(FalseVal, m_Neg(m_Intrinsic<Intrinsic::abs>(m_Specific(X)))))<br>
> +      return FalseVal;<br>
> +    if (match(TrueVal, m_Neg(m_Intrinsic<Intrinsic::abs>(m_Value(X)))) &&<br>
> +        match(FalseVal, m_Intrinsic<Intrinsic::abs>(m_Specific(X))))<br>
> +      return FalseVal;<br>
>     }<br>
>   <br>
>     // Check for other compares that behave like bit test.<br>
><br>
> diff  --git a/llvm/test/Transforms/InstSimplify/abs_intrinsic.ll b/llvm/test/Transforms/InstSimplify/abs_intrinsic.ll<br>
> index e9305a927c42..70b50da9f041 100644<br>
> --- a/llvm/test/Transforms/InstSimplify/abs_intrinsic.ll<br>
> +++ b/llvm/test/Transforms/InstSimplify/abs_intrinsic.ll<br>
> @@ -205,10 +205,7 @@ define i1 @abs_ule_int_min(i8 %x) {<br>
>   define i32 @select_abs_of_abs_eq(i32 %x) {<br>
>   ; CHECK-LABEL: @select_abs_of_abs_eq(<br>
>   ; CHECK-NEXT:    [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)<br>
> -; CHECK-NEXT:    [[NEG:%.*]] = sub i32 0, [[ABS]]<br>
> -; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], 0<br>
> -; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i32 [[NEG]], i32 [[ABS]]<br>
> -; CHECK-NEXT:    ret i32 [[SEL]]<br>
> +; CHECK-NEXT:    ret i32 [[ABS]]<br>
>   ;<br>
>     %abs = call i32 @llvm.abs.i32(i32 %x, i1 false)<br>
>     %neg = sub i32 0, %abs<br>
> @@ -220,10 +217,7 @@ define i32 @select_abs_of_abs_eq(i32 %x) {<br>
>   define i32 @select_abs_of_abs_ne(i32 %x) {<br>
>   ; CHECK-LABEL: @select_abs_of_abs_ne(<br>
>   ; CHECK-NEXT:    [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)<br>
> -; CHECK-NEXT:    [[NEG:%.*]] = sub i32 0, [[ABS]]<br>
> -; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[X]], 0<br>
> -; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i32 [[ABS]], i32 [[NEG]]<br>
> -; CHECK-NEXT:    ret i32 [[SEL]]<br>
> +; CHECK-NEXT:    ret i32 [[ABS]]<br>
>   ;<br>
>     %abs = call i32 @llvm.abs.i32(i32 %x, i1 false)<br>
>     %neg = sub i32 0, %abs<br>
> @@ -236,9 +230,7 @@ define i32 @select_nabs_of_abs_eq(i32 %x) {<br>
>   ; CHECK-LABEL: @select_nabs_of_abs_eq(<br>
>   ; CHECK-NEXT:    [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)<br>
>   ; CHECK-NEXT:    [[NEG:%.*]] = sub i32 0, [[ABS]]<br>
> -; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], 0<br>
> -; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i32 [[ABS]], i32 [[NEG]]<br>
> -; CHECK-NEXT:    ret i32 [[SEL]]<br>
> +; CHECK-NEXT:    ret i32 [[NEG]]<br>
>   ;<br>
>     %abs = call i32 @llvm.abs.i32(i32 %x, i1 false)<br>
>     %neg = sub i32 0, %abs<br>
> @@ -251,9 +243,7 @@ define i32 @select_nabs_of_abs_ne(i32 %x) {<br>
>   ; CHECK-LABEL: @select_nabs_of_abs_ne(<br>
>   ; CHECK-NEXT:    [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false)<br>
>   ; CHECK-NEXT:    [[NEG:%.*]] = sub i32 0, [[ABS]]<br>
> -; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i32 [[X]], 0<br>
> -; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP]], i32 [[NEG]], i32 [[ABS]]<br>
> -; CHECK-NEXT:    ret i32 [[SEL]]<br>
> +; CHECK-NEXT:    ret i32 [[NEG]]<br>
>   ;<br>
>     %abs = call i32 @llvm.abs.i32(i32 %x, i1 false)<br>
>     %neg = sub i32 0, %abs<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>
</blockquote></div></div>