diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-02-24 20:23:51 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-02-24 20:23:51 +0100 |
commit | 953e25c44acc2458d854b1442d7775d997aaf187 (patch) | |
tree | 2c8a21a84fef81eadb262cc7c2dab57ccd1d2046 /gcc/rtlanal.c | |
parent | c7f01cb61dd80f3c8282ae81a4d60c654908eb69 (diff) | |
download | gcc-953e25c44acc2458d854b1442d7775d997aaf187.zip gcc-953e25c44acc2458d854b1442d7775d997aaf187.tar.gz gcc-953e25c44acc2458d854b1442d7775d997aaf187.tar.bz2 |
re PR rtl-optimization/89445 (_mm512_maskz_loadu_pd "forgets" to use the mask)
PR rtl-optimization/89445
* simplify-rtx.c (simplify_ternary_operation): Don't use
simplify_merge_mask on operands that may trap.
* rtlanal.c (may_trap_p_1): Use FLOAT_MODE_P instead of
SCALAR_FLOAT_MODE_P checks. For integral division by zero, if
second operand is CONST_VECTOR, check if any element could be zero.
Don't expect traps for VEC_{MERGE,SELECT,CONCAT,DUPLICATE} unless
their operands can trap.
* gcc.target/i386/avx512f-pr89445.c: New test.
From-SVN: r269176
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 345f13c..3873b40 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -2846,10 +2846,28 @@ may_trap_p_1 (const_rtx x, unsigned flags) case UMOD: if (HONOR_SNANS (x)) return 1; - if (SCALAR_FLOAT_MODE_P (GET_MODE (x))) + if (FLOAT_MODE_P (GET_MODE (x))) return flag_trapping_math; if (!CONSTANT_P (XEXP (x, 1)) || (XEXP (x, 1) == const0_rtx)) return 1; + if (GET_CODE (XEXP (x, 1)) == CONST_VECTOR) + { + /* For CONST_VECTOR, return 1 if any element is or might be zero. */ + unsigned int n_elts; + rtx op = XEXP (x, 1); + if (!GET_MODE_NUNITS (GET_MODE (op)).is_constant (&n_elts)) + { + if (!CONST_VECTOR_DUPLICATE_P (op)) + return 1; + for (unsigned i = 0; i < (unsigned int) XVECLEN (op, 0); i++) + if (CONST_VECTOR_ENCODED_ELT (op, i) == const0_rtx) + return 1; + } + else + for (unsigned i = 0; i < n_elts; i++) + if (CONST_VECTOR_ELT (op, i) == const0_rtx) + return 1; + } break; case EXPR_LIST: @@ -2898,12 +2916,16 @@ may_trap_p_1 (const_rtx x, unsigned flags) case NEG: case ABS: case SUBREG: + case VEC_MERGE: + case VEC_SELECT: + case VEC_CONCAT: + case VEC_DUPLICATE: /* These operations don't trap even with floating point. */ break; default: /* Any floating arithmetic may trap. */ - if (SCALAR_FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math) + if (FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math) return 1; } |