Hi!
I have a C floating point comparison (a <= b && a >= b), which
test_for_singularity turns into (a <= b && a == b) and vectorizer turns
into ((a <= b) & (a == b)). So far so good.
eliminate_redundant_comparison, however, turns it into just (a == b).
I don't think this is correct, because (a <= b) traps and (a == b)
doesn't. The following helps:
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -2144,7 +2144,7 @@ eliminate_redundant_comparison (enum tree_code
opcode,
if (TREE_CODE (curr->op) != SSA_NAME)
return false;
def1 = SSA_NAME_DEF_STMT (curr->op);
- if (!is_gimple_assign (def1))
+ if (!is_gimple_assign (def1) || gimple_could_trap_p (def1))
return false;
lcode = gimple_assign_rhs_code (def1);
if (TREE_CODE_CLASS (lcode) != tcc_comparison)
@@ -2160,7 +2160,7 @@ eliminate_redundant_comparison (enum tree_code
opcode,
if (TREE_CODE (oe->op) != SSA_NAME)
continue;
def2 = SSA_NAME_DEF_STMT (oe->op);
- if (!is_gimple_assign (def2))
+ if (!is_gimple_assign (def2) || gimple_could_trap_p (def2))
continue;
rcode = gimple_assign_rhs_code (def2);
if (TREE_CODE_CLASS (rcode) != tcc_comparison)
However, I couldn't help noticing that other parts of reassociation
pass use stmt_could_throw_p, and trapping is mentioned only in one
place. Is this intentional? Shouldn't both throwing and trapping
block reassociation?
Best regards,
Ilya