Commit 2e64f8b8 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/38878 (gcc.dg/tree-ssa/foldaddr-1.c XFAILed)

	PR middle-end/38878
	* fold-const.c (fold_binary_loc) <case EQ_EXPR, NE_EXPR>: Add
	STRIP_NOPS on arg0 and arg1.  When optimizing X +- C == X
	and C - X == X also strip nops from +/-/p+ operand.
	When optimizing -X == C, fold C to arg0's type.

	* gcc.dg/tree-ssa/foldaddr-1.c: Remove xfail.

From-SVN: r170957
parent de888d90
2011-03-14 Jakub Jelinek <jakub@redhat.com> 2011-03-14 Jakub Jelinek <jakub@redhat.com>
PR middle-end/38878
* fold-const.c (fold_binary_loc) <case EQ_EXPR, NE_EXPR>: Add
STRIP_NOPS on arg0 and arg1. When optimizing X +- C == X
and C - X == X also strip nops from +/-/p+ operand.
When optimizing -X == C, fold C to arg0's type.
PR debug/47946 PR debug/47946
* dwarf2out.c (add_bit_offset_attribute): If bit_offset is negative, * dwarf2out.c (add_bit_offset_attribute): If bit_offset is negative,
emit it as add_AT_int instead of add_AT_unsigned. emit it as add_AT_int instead of add_AT_unsigned.
......
...@@ -12112,6 +12112,9 @@ fold_binary_loc (location_t loc, ...@@ -12112,6 +12112,9 @@ fold_binary_loc (location_t loc,
case EQ_EXPR: case EQ_EXPR:
case NE_EXPR: case NE_EXPR:
STRIP_NOPS (arg0);
STRIP_NOPS (arg1);
tem = fold_comparison (loc, code, type, op0, op1); tem = fold_comparison (loc, code, type, op0, op1);
if (tem != NULL_TREE) if (tem != NULL_TREE)
return tem; return tem;
...@@ -12194,7 +12197,8 @@ fold_binary_loc (location_t loc, ...@@ -12194,7 +12197,8 @@ fold_binary_loc (location_t loc,
/* Similarly for a NEGATE_EXPR. */ /* Similarly for a NEGATE_EXPR. */
if (TREE_CODE (arg0) == NEGATE_EXPR if (TREE_CODE (arg0) == NEGATE_EXPR
&& TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST
&& 0 != (tem = negate_expr (arg1)) && 0 != (tem = negate_expr (fold_convert_loc (loc, TREE_TYPE (arg0),
arg1)))
&& TREE_CODE (tem) == INTEGER_CST && TREE_CODE (tem) == INTEGER_CST
&& !TREE_OVERFLOW (tem)) && !TREE_OVERFLOW (tem))
return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem); return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), tem);
...@@ -12214,7 +12218,9 @@ fold_binary_loc (location_t loc, ...@@ -12214,7 +12218,9 @@ fold_binary_loc (location_t loc,
if ((TREE_CODE (arg0) == PLUS_EXPR if ((TREE_CODE (arg0) == PLUS_EXPR
|| TREE_CODE (arg0) == POINTER_PLUS_EXPR || TREE_CODE (arg0) == POINTER_PLUS_EXPR
|| TREE_CODE (arg0) == MINUS_EXPR) || TREE_CODE (arg0) == MINUS_EXPR)
&& operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
0)),
arg1, 0)
&& (INTEGRAL_TYPE_P (TREE_TYPE (arg0)) && (INTEGRAL_TYPE_P (TREE_TYPE (arg0))
|| POINTER_TYPE_P (TREE_TYPE (arg0)))) || POINTER_TYPE_P (TREE_TYPE (arg0))))
{ {
...@@ -12230,7 +12236,9 @@ fold_binary_loc (location_t loc, ...@@ -12230,7 +12236,9 @@ fold_binary_loc (location_t loc,
/* Transform comparisons of the form C - X CMP X if C % 2 == 1. */ /* Transform comparisons of the form C - X CMP X if C % 2 == 1. */
if (TREE_CODE (arg0) == MINUS_EXPR if (TREE_CODE (arg0) == MINUS_EXPR
&& TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST && TREE_CODE (TREE_OPERAND (arg0, 0)) == INTEGER_CST
&& operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0) && operand_equal_p (tree_strip_nop_conversions (TREE_OPERAND (arg0,
1)),
arg1, 0)
&& (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1) && (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 0)) & 1) == 1)
{ {
return omit_two_operands_loc (loc, type, return omit_two_operands_loc (loc, type,
......
2011-03-14 Jakub Jelinek <jakub@redhat.com>
PR middle-end/38878
* gcc.dg/tree-ssa/foldaddr-1.c: Remove xfail.
2011-03-14 Uros Bizjak <ubizjak@gmail.com> 2011-03-14 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/sse4_1-floor-vec.c: New test. * gcc.target/i386/sse4_1-floor-vec.c: New test.
......
...@@ -11,6 +11,6 @@ int foo(char *b) ...@@ -11,6 +11,6 @@ int foo(char *b)
/* Folding should have determined that the two addresses were /* Folding should have determined that the two addresses were
not identical and thus collapsed the function into a trivial not identical and thus collapsed the function into a trivial
"return 0". */ "return 0". */
/* { dg-final { scan-tree-dump-times "return 0" 1 "original" { xfail *-*-* } } } */ /* { dg-final { scan-tree-dump-times "return 0" 1 "original" } } */
/* { dg-final { cleanup-tree-dump "original" } } */ /* { dg-final { cleanup-tree-dump "original" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment