[llvm] ff5094c - [X86] Add tests showing failure to fold mul(abs(x),abs(x)) -> mul(x,x) (PR39476)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sun May 3 09:48:10 PDT 2020
Shouldn’t we doing this in InstCombine?
On Sun, May 3, 2020 at 9:44 AM Simon Pilgrim via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
>
> Author: Simon Pilgrim
> Date: 2020-05-03T17:39:48+01:00
> New Revision: ff5094c03f7d4c126c8e052a63c7255572200adb
>
> URL:
> https://github.com/llvm/llvm-project/commit/ff5094c03f7d4c126c8e052a63c7255572200adb
> DIFF:
> https://github.com/llvm/llvm-project/commit/ff5094c03f7d4c126c8e052a63c7255572200adb.diff
>
> LOG: [X86] Add tests showing failure to fold mul(abs(x),abs(x)) ->
> mul(x,x) (PR39476)
>
> Added:
>
>
> Modified:
> llvm/test/CodeGen/X86/combine-mul.ll
>
> Removed:
>
>
>
>
> ################################################################################
> diff --git a/llvm/test/CodeGen/X86/combine-mul.ll
> b/llvm/test/CodeGen/X86/combine-mul.ll
> index 8c38352c6b2f..98fbd37f0d64 100644
> --- a/llvm/test/CodeGen/X86/combine-mul.ll
> +++ b/llvm/test/CodeGen/X86/combine-mul.ll
> @@ -283,6 +283,77 @@ define <4 x i32> @combine_vec_mul_add(<4 x i32> %x) {
> ret <4 x i32> %2
> }
>
> +; TODO fold mul(abs(x),abs(x)) -> mul(x,x)
> +
> +define i31 @combine_mul_abs_i31(i31 %0) {
> +; SSE-LABEL: combine_mul_abs_i31:
> +; SSE: # %bb.0:
> +; SSE-NEXT: addl %edi, %edi
> +; SSE-NEXT: sarl %edi
> +; SSE-NEXT: movl %edi, %eax
> +; SSE-NEXT: negl %eax
> +; SSE-NEXT: cmovll %edi, %eax
> +; SSE-NEXT: imull %eax, %eax
> +; SSE-NEXT: retq
> +;
> +; AVX-LABEL: combine_mul_abs_i31:
> +; AVX: # %bb.0:
> +; AVX-NEXT: addl %edi, %edi
> +; AVX-NEXT: sarl %edi
> +; AVX-NEXT: movl %edi, %eax
> +; AVX-NEXT: negl %eax
> +; AVX-NEXT: cmovll %edi, %eax
> +; AVX-NEXT: imull %eax, %eax
> +; AVX-NEXT: retq
> + %c = icmp slt i31 %0, 0
> + %s = sub nsw i31 0, %0
> + %r = select i1 %c, i31 %s, i31 %0
> + %m = mul i31 %r, %r
> + ret i31 %m
> +}
> +
> +define i32 @combine_mul_abs_i32(i32 %0) {
> +; SSE-LABEL: combine_mul_abs_i32:
> +; SSE: # %bb.0:
> +; SSE-NEXT: movl %edi, %eax
> +; SSE-NEXT: negl %eax
> +; SSE-NEXT: cmovll %edi, %eax
> +; SSE-NEXT: imull %eax, %eax
> +; SSE-NEXT: retq
> +;
> +; AVX-LABEL: combine_mul_abs_i32:
> +; AVX: # %bb.0:
> +; AVX-NEXT: movl %edi, %eax
> +; AVX-NEXT: negl %eax
> +; AVX-NEXT: cmovll %edi, %eax
> +; AVX-NEXT: imull %eax, %eax
> +; AVX-NEXT: retq
> + %c = icmp slt i32 %0, 0
> + %s = sub nsw i32 0, %0
> + %r = select i1 %c, i32 %s, i32 %0
> + %m = mul i32 %r, %r
> + ret i32 %m
> +}
> +
> +define <4 x i32> @combine_mul_abs_v4i32(<4 x i32> %0) {
> +; SSE-LABEL: combine_mul_abs_v4i32:
> +; SSE: # %bb.0:
> +; SSE-NEXT: pabsd %xmm0, %xmm0
> +; SSE-NEXT: pmulld %xmm0, %xmm0
> +; SSE-NEXT: retq
> +;
> +; AVX-LABEL: combine_mul_abs_v4i32:
> +; AVX: # %bb.0:
> +; AVX-NEXT: vpabsd %xmm0, %xmm0
> +; AVX-NEXT: vpmulld %xmm0, %xmm0, %xmm0
> +; AVX-NEXT: retq
> + %c = icmp slt <4 x i32> %0, zeroinitializer
> + %s = sub nsw <4 x i32> zeroinitializer, %0
> + %r = select <4 x i1> %c, <4 x i32> %s, <4 x i32> %0
> + %m = mul <4 x i32> %r, %r
> + ret <4 x i32> %m
> +}
> +
> ; This would infinite loop because DAGCombiner wants to turn this into a
> shift,
> ; but x86 lowering wants to avoid non-uniform vector shift amounts.
>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
--
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200503/7c65473f/attachment.html>
More information about the llvm-commits
mailing list