From: Richard Guenther Date: Thu, 3 May 2012 08:37:18 +0000 (+0000) Subject: re PR middle-end/53144 (PPRE infinite loop) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9179ed9dfcff3506a350f19f835c4a1680d6886b;p=gcc.git re PR middle-end/53144 (PPRE infinite loop) 2012-05-03 Richard Guenther PR tree-optimization/53144 * tree-ssa-sccvn.c (vn_reference_lookup_or_insert_constant_for_pieces): Rename to ... (vn_reference_lookup_or_insert_for_pieces): ... this. Properly deal with SSA name values. (vn_reference_lookup_3): Adjust callers. * gcc.dg/torture/pr53144.c: New testcase. From-SVN: r187078 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c8132ff8d5..142cf363001 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-05-03 Richard Guenther + + PR tree-optimization/53144 + * tree-ssa-sccvn.c (vn_reference_lookup_or_insert_constant_for_pieces): + Rename to ... + (vn_reference_lookup_or_insert_for_pieces): ... this. Properly deal + with SSA name values. + (vn_reference_lookup_3): Adjust callers. + 2012-05-03 Ganesh Gopalasubramanian * config/i386/driver-i386.c (host_detect_local_cpu): Reset diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 08d19b520d7..b3063cc3cb4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-03 Richard Guenther + + PR tree-optimization/53144 + * gcc.dg/torture/pr53144.c: New testcase. + 2012-05-03 Tobias Burnus PR fortran/52864 diff --git a/gcc/testsuite/gcc.dg/torture/pr53144.c b/gcc/testsuite/gcc.dg/torture/pr53144.c new file mode 100644 index 00000000000..ad94812ad7c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr53144.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +typedef unsigned char __attribute__((vector_size(4))) uvec; + +int main (int argc, char *argv[]) { + int i; + int x = 0; + uvec uc0 = (uvec) {argc, 1, 2, 10}; + unsigned char uc1[4] = {0, 3, 2, 200}; + signed char ucg[4] = {1, 0, 0, 0 }; + signed char ucl[4] = {0, 1, 0, 1 }; + +#define uc0_ ((unsigned char *)&uc0) + + for (i = 0; i < 4; i ++) { + x |= ucg[i] != (uc0_[i] > uc1[i]); + x |= ucl[i] != (uc0_[i] < uc1[i]); + } + return x; +} + diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index e9e6bfa7c70..ad9460b9411 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1348,18 +1348,19 @@ vn_reference_lookup_2 (ao_ref *op ATTRIBUTE_UNUSED, tree vuse, void *vr_) /* Lookup an existing or insert a new vn_reference entry into the value table for the VUSE, SET, TYPE, OPERANDS reference which - has the constant value CST. */ + has the value VALUE which is either a constant or an SSA name. */ static vn_reference_t -vn_reference_lookup_or_insert_constant_for_pieces (tree vuse, - alias_set_type set, - tree type, - VEC (vn_reference_op_s, - heap) *operands, - tree cst) +vn_reference_lookup_or_insert_for_pieces (tree vuse, + alias_set_type set, + tree type, + VEC (vn_reference_op_s, + heap) *operands, + tree value) { struct vn_reference_s vr1; vn_reference_t result; + unsigned value_id; vr1.vuse = vuse; vr1.operands = operands; vr1.type = type; @@ -1367,10 +1368,13 @@ vn_reference_lookup_or_insert_constant_for_pieces (tree vuse, vr1.hashcode = vn_reference_compute_hash (&vr1); if (vn_reference_lookup_1 (&vr1, &result)) return result; + if (TREE_CODE (value) == SSA_NAME) + value_id = VN_INFO (value)->value_id; + else + value_id = get_or_alloc_constant_value_id (value); return vn_reference_insert_pieces (vuse, set, type, VEC_copy (vn_reference_op_s, heap, - operands), cst, - get_or_alloc_constant_value_id (cst)); + operands), value, value_id); } /* Callback for walk_non_aliased_vuses. Tries to perform a lookup @@ -1452,7 +1456,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) && offset2 + size2 >= offset + maxsize) { tree val = build_zero_cst (vr->type); - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } } @@ -1473,7 +1477,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) && offset2 + size2 >= offset + maxsize) { tree val = build_zero_cst (vr->type); - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } } @@ -1514,7 +1518,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) / BITS_PER_UNIT), ref->size / BITS_PER_UNIT); if (val) - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } } @@ -1568,7 +1572,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) } } if (val) - return vn_reference_lookup_or_insert_constant_for_pieces + return vn_reference_lookup_or_insert_for_pieces (vuse, vr->set, vr->type, vr->operands, val); } }