[Bug middle-end/82062] [8 regression] simple conditional expressions no longer folded
ebotcazou at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Oct 25 07:39:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82062
--- Comment #7 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
But in fact we probably just need:
Index: fold-const.c
===================================================================
--- fold-const.c (revision 254037)
+++ fold-const.c (working copy)
@@ -3366,7 +3366,8 @@ operand_equal_p (const_tree arg0, const_
#undef OP_SAME_WITH_NULL
}
-/* Similar to operand_equal_p, but strip nops first. */
+/* Similar to operand_equal_p, but see if ARG1 might be a variant of ARG0
+ with a different signedness or a simple conversion. */
static bool
operand_equal_for_comparison_p (tree arg0, tree arg1)
@@ -3378,12 +3379,15 @@ operand_equal_for_comparison_p (tree arg
|| ! INTEGRAL_TYPE_P (TREE_TYPE (arg1)))
return false;
- /* Discard any conversions that don't change the modes of ARG0 and ARG1
- and see if the inner values are the same. This removes any
- signedness comparison, which doesn't matter here. */
- STRIP_NOPS (arg0);
- STRIP_NOPS (arg1);
- if (operand_equal_p (arg0, arg1, 0))
+ tree op0 = arg0;
+ tree op1 = arg1;
+ STRIP_NOPS (op0);
+ STRIP_NOPS (op1);
+ if (operand_equal_p (op0, op1, 0))
+ return true;
+
+ if (TREE_CODE (arg1) == NOP_EXPR
+ && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0))
return true;
return false;
More information about the Gcc-bugs
mailing list