diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-05-21 16:25:03 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-05-21 16:25:03 +0200 |
commit | 27edb974ee6ab6c0be6118835e6a7b395899531a (patch) | |
tree | baea0e384baa178c2869b3a68a1f5c35d3ca5a75 /gcc | |
parent | fb639843e4bb0b43d08de4baca618fe98ee04e91 (diff) | |
download | gcc-27edb974ee6ab6c0be6118835e6a7b395899531a.zip gcc-27edb974ee6ab6c0be6118835e6a7b395899531a.tar.gz gcc-27edb974ee6ab6c0be6118835e6a7b395899531a.tar.bz2 |
re PR tree-optimization/53410 (ICE in build_int_cst_wide, at tree.c:1219)
PR tree-optimization/53410
* fold-const.c (fold_binary_loc): Use build_zero_cst (type)
instead of build_int_cst (type, 0) where vector types might be
involved. Instead of build_int_cst (type, 1) convert the original
integer_onep argument to the desired type.
* gcc.c-torture/compile/pr53410-1.c: New test.
* gcc.c-torture/compile/pr53410-2.c: New test.
From-SVN: r187715
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fold-const.c | 40 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr53410-1.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr53410-2.c | 64 |
5 files changed, 110 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 597064b..c52e9df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-05-21 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/53410 + * fold-const.c (fold_binary_loc): Use build_zero_cst (type) + instead of build_int_cst (type, 0) where vector types might be + involved. Instead of build_int_cst (type, 1) convert the original + integer_onep argument to the desired type. + 2012-05-21 Michael Matz <matz@suse.de> * genattrtab.c (attr_rtx_cost): Move earlier, start with cost being 1. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index c68db73..20b07d0 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -11245,7 +11245,7 @@ fold_binary_loc (location_t loc, && integer_onep (TREE_OPERAND (arg0, 1)) && integer_onep (arg1)) return fold_build2_loc (loc, EQ_EXPR, type, arg0, - build_int_cst (TREE_TYPE (arg0), 0)); + build_zero_cst (TREE_TYPE (arg0))); /* Fold (X & Y) ^ Y as ~X & Y. */ if (TREE_CODE (arg0) == BIT_AND_EXPR @@ -11355,21 +11355,25 @@ fold_binary_loc (location_t loc, && integer_onep (TREE_OPERAND (arg0, 1)) && integer_onep (arg1)) { + tree tem2; tem = TREE_OPERAND (arg0, 0); - return fold_build2_loc (loc, EQ_EXPR, type, - fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem, - build_int_cst (TREE_TYPE (tem), 1)), - build_int_cst (TREE_TYPE (tem), 0)); + tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1); + tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), + tem, tem2); + return fold_build2_loc (loc, EQ_EXPR, type, tem2, + build_zero_cst (TREE_TYPE (tem))); } /* Fold ~X & 1 as (X & 1) == 0. */ if (TREE_CODE (arg0) == BIT_NOT_EXPR && integer_onep (arg1)) { + tree tem2; tem = TREE_OPERAND (arg0, 0); - return fold_build2_loc (loc, EQ_EXPR, type, - fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem, - build_int_cst (TREE_TYPE (tem), 1)), - build_int_cst (TREE_TYPE (tem), 0)); + tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1); + tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), + tem, tem2); + return fold_build2_loc (loc, EQ_EXPR, type, tem2, + build_zero_cst (TREE_TYPE (tem))); } /* Fold !X & 1 as X == 0. */ if (TREE_CODE (arg0) == TRUTH_NOT_EXPR @@ -11377,7 +11381,7 @@ fold_binary_loc (location_t loc, { tem = TREE_OPERAND (arg0, 0); return fold_build2_loc (loc, EQ_EXPR, type, tem, - build_int_cst (TREE_TYPE (tem), 0)); + build_zero_cst (TREE_TYPE (tem))); } /* Fold (X ^ Y) & Y as ~X & Y. */ @@ -12893,13 +12897,13 @@ fold_binary_loc (location_t loc, if (TREE_CODE (arg0) == BIT_XOR_EXPR && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), - build_int_cst (TREE_TYPE (arg0), 0)); + build_zero_cst (TREE_TYPE (arg0))); /* Likewise (X ^ Y) == X becomes Y == 0. X has no side-effects. */ if (TREE_CODE (arg0) == BIT_XOR_EXPR && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1), - build_int_cst (TREE_TYPE (arg0), 0)); + build_zero_cst (TREE_TYPE (arg0))); /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */ if (TREE_CODE (arg0) == BIT_XOR_EXPR @@ -12987,7 +12991,7 @@ fold_binary_loc (location_t loc, BIT_XOR_EXPR, itype, arg00, arg10), arg01), - build_int_cst (itype, 0)); + build_zero_cst (itype)); if (operand_equal_p (arg01, arg10, 0)) return fold_build2_loc (loc, code, type, @@ -12996,7 +13000,7 @@ fold_binary_loc (location_t loc, BIT_XOR_EXPR, itype, arg00, arg11), arg01), - build_int_cst (itype, 0)); + build_zero_cst (itype)); if (operand_equal_p (arg00, arg11, 0)) return fold_build2_loc (loc, code, type, @@ -13005,7 +13009,7 @@ fold_binary_loc (location_t loc, BIT_XOR_EXPR, itype, arg01, arg10), arg00), - build_int_cst (itype, 0)); + build_zero_cst (itype)); if (operand_equal_p (arg00, arg10, 0)) return fold_build2_loc (loc, code, type, @@ -13014,7 +13018,7 @@ fold_binary_loc (location_t loc, BIT_XOR_EXPR, itype, arg01, arg11), arg00), - build_int_cst (itype, 0)); + build_zero_cst (itype)); } if (TREE_CODE (arg0) == BIT_XOR_EXPR @@ -13492,7 +13496,7 @@ fold_binary_loc (location_t loc, return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0, TREE_OPERAND (arg1, 1)), - build_int_cst (TREE_TYPE (arg0), 0)); + build_zero_cst (TREE_TYPE (arg0))); if ((code == LT_EXPR || code == GE_EXPR) && TYPE_UNSIGNED (TREE_TYPE (arg0)) @@ -13504,7 +13508,7 @@ fold_binary_loc (location_t loc, TREE_OPERAND (TREE_OPERAND (arg1, 0), 1)); return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, fold_convert_loc (loc, TREE_TYPE (arg0), tem), - build_int_cst (TREE_TYPE (arg0), 0)); + build_zero_cst (TREE_TYPE (arg0))); } return NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 63667c0..c50ae2f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-05-21 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/53410 + * gcc.c-torture/compile/pr53410-1.c: New test. + * gcc.c-torture/compile/pr53410-2.c: New test. + 2012-05-21 H.J. Lu <hongjiu.lu@intel.com> PR target/53425 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr53410-1.c b/gcc/testsuite/gcc.c-torture/compile/pr53410-1.c new file mode 100644 index 0000000..48a014e --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr53410-1.c @@ -0,0 +1,10 @@ +/* PR tree-optimization/53410 */ + +int *a, b, c, d; + +void +foo (void) +{ + for (; d <= 0; d++) + b &= ((a || d) ^ c) == 1; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/pr53410-2.c b/gcc/testsuite/gcc.c-torture/compile/pr53410-2.c new file mode 100644 index 0000000..06aa7fe --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr53410-2.c @@ -0,0 +1,64 @@ +/* PR tree-optimization/53410 */ + +typedef int V __attribute__((vector_size (4 * sizeof (int)))); +typedef unsigned int W __attribute__((vector_size (4 * sizeof (int)))); + +void +f1 (V *p) +{ + *p = (*p & ((V) { 1, 1, 1, 1 })) ^ ((V) { 1, 1, 1, 1}); +} + +void +f2 (V *p) +{ + *p = (*p ^ ((V) { 1, 1, 1, 1 })) & ((V) { 1, 1, 1, 1}); +} + +void +f3 (V *p) +{ + *p = (~*p) & ((V) { 1, 1, 1, 1 }); +} + +void +f4 (V *p, V *q) +{ + *p = (*p ^ *q) == *q; +} + +void +f5 (V *p, V *q) +{ + *p = (*p ^ *q) == *p; +} + +void +f6 (V *p, V *q, V *r) +{ + *p = (*p & *r) == (*q & *r); +} + +void +f7 (V *p, V *q, V *r) +{ + *p = (*p & *r) == (*r & *q); +} + +void +f8 (V *p, V *q, V *r) +{ + *p = (*r & *p) == (*q & *r); +} + +void +f9 (V *p, V *q, V *r) +{ + *p = (*r & *p) == (*r & *q); +} + +void +f10 (W *p, W *q) +{ + *p = *p < (((const W) { 1U, 1U, 1U, 1U }) << *q); +} |