Bin Cheng <bin.ch...@arm.com> writes:
> Hi,
> This simple patch fixes the ICE by adding LTGT in
> vec_cmp<mode><v_cmp_result> pattern.
> I also modified the original test case into a compilation one since
> -fno-wrapping-math
> should not be used in general.
> Bootstrap and test on AArch64, test result check for x86_64.  Is it OK?
> I would also need to
> backport it to gcc-7-branch.
>
> Thanks,
> bin
> 2017-07-27  Bin Cheng  <bin.ch...@arm.com>
>
>       PR target/81228
>       * config/aarch64/aarch64-simd.md (vec_cmp<mode><v_cmp_result>): Add
>       LTGT.
>
> gcc/testsuite/ChangeLog
> 2017-07-27  Bin Cheng  <bin.ch...@arm.com>
>
>       PR target/81228
>       * gcc.dg/pr81228.c: New.
>
> diff --git a/gcc/config/aarch64/aarch64-simd.md 
> b/gcc/config/aarch64/aarch64-simd.md
> index 011fcec0..9cd67a2 100644
> --- a/gcc/config/aarch64/aarch64-simd.md
> +++ b/gcc/config/aarch64/aarch64-simd.md
> @@ -2524,6 +2524,7 @@
>      case EQ:
>        comparison = gen_aarch64_cmeq<mode>;
>        break;
> +    case LTGT:
>      case UNEQ:
>      case ORDERED:
>      case UNORDERED:
> @@ -2571,6 +2572,7 @@
>        emit_insn (comparison (operands[0], operands[2], operands[3]));
>        break;
>  
> +    case LTGT:
>      case UNEQ:
>        /* We first check (a > b ||  b > a) which is !UNEQ, inverting
>        this result will then give us (a == b || a UNORDERED b).  */
> @@ -2578,7 +2580,8 @@
>                                        operands[2], operands[3]));
>        emit_insn (gen_aarch64_cmgt<mode> (tmp, operands[3], operands[2]));
>        emit_insn (gen_ior<v_cmp_result>3 (operands[0], operands[0], tmp));
> -      emit_insn (gen_one_cmpl<v_cmp_result>2 (operands[0], operands[0]));
> +      if (code == UNEQ)
> +     emit_insn (gen_one_cmpl<v_cmp_result>2 (operands[0], operands[0]));
>        break;

AFAIK this is still a grey area, but I think (ltgt x y) is supposed to
be a trapping operation, i.e. it's closer to (ior (lt x y) (gt x y))
than (not (uneq x y)).  See e.g. the handling in may_trap_p_1, where
LTGT is handled like LT and GT rather than like UNEQ.

See also: https://gcc.gnu.org/ml/gcc-patches/2015-02/msg00583.html

Thanks,
Richard

Reply via email to