This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/81162] [8 Regression] UBSAN switch triggers incorrect optimization in SLSR
- From: "wschmidt at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 30 Jun 2017 16:55:51 +0000
- Subject: [Bug tree-optimization/81162] [8 Regression] UBSAN switch triggers incorrect optimization in SLSR
- Auto-submitted: auto-generated
- References: <bug-81162-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81162
--- Comment #7 from Bill Schmidt <wschmidt at gcc dot gnu.org> ---
This case comes up when we're going to replace a NEGATE_EXPR with a PLUS_EXPR
or MINUS_EXPR. This is another case of an unprofitable replacement that should
be avoided anyway. So I think the following fix is what we need:
Index: gcc/gimple-ssa-strength-reduction.c
===================================================================
--- gcc/gimple-ssa-strength-reduction.c (revision 249846)
+++ gcc/gimple-ssa-strength-reduction.c (working copy)
@@ -2082,13 +2082,14 @@ replace_mult_candidate (slsr_cand_t c, tree basis_
types but allows for safe negation without twisted logic. */
if (wi::fits_shwi_p (bump)
&& bump.to_shwi () != HOST_WIDE_INT_MIN
- /* It is not useful to replace casts, copies, or adds of
+ /* It is not useful to replace casts, copies, negates, or adds of
an SSA name and a constant. */
&& cand_code != SSA_NAME
&& !CONVERT_EXPR_CODE_P (cand_code)
&& cand_code != PLUS_EXPR
&& cand_code != POINTER_PLUS_EXPR
- && cand_code != MINUS_EXPR)
+ && cand_code != MINUS_EXPR
+ && cand_code != NEGATE_EXPR)
{
enum tree_code code = PLUS_EXPR;
tree bump_tree;
This fixes the particular test. I have to head out on vacation now, but I will
regstrap this and submit it when I get back if there are no objections.