diff options
author | Richard Biener <rguenther@suse.de> | 2021-11-11 09:40:36 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-11-11 10:32:51 +0100 |
commit | a5fed4063f428a14f5b91533d5954b9bf4e3e7db (patch) | |
tree | 47f798ce0c99aae61fdf9f26d1075286fd9c6189 /gcc/tree-eh.c | |
parent | 10db7573014008ff867098206f51012d501ab57b (diff) | |
download | gcc-a5fed4063f428a14f5b91533d5954b9bf4e3e7db.zip gcc-a5fed4063f428a14f5b91533d5954b9bf4e3e7db.tar.gz gcc-a5fed4063f428a14f5b91533d5954b9bf4e3e7db.tar.bz2 |
middle-end/103181 - fix operation_could_trap_p for vector division
For integer vector division we only checked for all zero vector
constants rather than checking whether any element in the constant
vector is zero.
2021-11-11 Richard Biener <rguenther@suse.de>
PR middle-end/103181
* tree-eh.c (operation_could_trap_helper_p): Properly
check vector constants for a zero element for integer
division. Separate floating point and integer division code.
* gcc.dg/torture/pr103181.c: New testcase.
Diffstat (limited to 'gcc/tree-eh.c')
-rw-r--r-- | gcc/tree-eh.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 3a09de9..3eff07f 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -2454,15 +2454,31 @@ operation_could_trap_helper_p (enum tree_code op, case FLOOR_MOD_EXPR: case ROUND_MOD_EXPR: case TRUNC_MOD_EXPR: - case RDIV_EXPR: - if (honor_snans) - return true; - if (fp_operation) - return flag_trapping_math; if (!TREE_CONSTANT (divisor) || integer_zerop (divisor)) return true; + if (TREE_CODE (divisor) == VECTOR_CST) + { + /* Inspired by initializer_each_zero_or_onep. */ + unsigned HOST_WIDE_INT nelts = vector_cst_encoded_nelts (divisor); + if (VECTOR_CST_STEPPED_P (divisor) + && !TYPE_VECTOR_SUBPARTS (TREE_TYPE (divisor)) + .is_constant (&nelts)) + return true; + for (unsigned int i = 0; i < nelts; ++i) + { + tree elt = vector_cst_elt (divisor, i); + if (integer_zerop (elt)) + return true; + } + } return false; + case RDIV_EXPR: + if (honor_snans) + return true; + gcc_assert (fp_operation); + return flag_trapping_math; + case LT_EXPR: case LE_EXPR: case GT_EXPR: |