From d763bb10051498ab4bafe220b644f2aa414de381 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Tue, 31 May 2005 09:40:09 -0700 Subject: [PATCH] [multiple changes] 2005-05-31 Andrew pinski PR middle-end/20931 * g++.dg/opt/pr20931.C: New test. 2005-05-31 Andrew Pinski PR middle-end/20931 PR middle-end/20946 * fold-const.c (fold_checksum_tree): Copy types also if TYPE_CONTAINS_PLACEHOLDER_INTERNAL is set. Don't call fold_checksum_tree for TREE_LIST's TREE_CHAIN first. Tail recurse TREE_LIST's TREE_CHAIN. From-SVN: r100397 --- gcc/ChangeLog | 10 ++++++++++ gcc/fold-const.c | 11 +++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr20931.C | 13 +++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr20931.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25cd8c645b6..f486794d600 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2005-05-31 Andrew Pinski + + PR middle-end/20931 + PR middle-end/20946 + * fold-const.c (fold_checksum_tree): Copy types also if + TYPE_CONTAINS_PLACEHOLDER_INTERNAL is set. + Don't call fold_checksum_tree for TREE_LIST's TREE_CHAIN + first. + Tail recurse TREE_LIST's TREE_CHAIN. + 2005-05-31 Andrew Pinski PR tree-opt/21732 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index c780659b556..97caf1515a2 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10419,6 +10419,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht) enum tree_code code; char buf[sizeof (struct tree_decl)]; int i, len; + +recursive_label: gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree) <= sizeof (struct tree_decl)) @@ -10440,11 +10442,13 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht) } else if (TREE_CODE_CLASS (code) == tcc_type && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr) - || TYPE_CACHED_VALUES_P (expr))) + || TYPE_CACHED_VALUES_P (expr) + || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr))) { /* Allow these fields to be modified. */ memcpy (buf, expr, tree_size (expr)); expr = (tree) buf; + TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0; TYPE_POINTER_TO (expr) = NULL; TYPE_REFERENCE_TO (expr) = NULL; if (TYPE_CACHED_VALUES_P (expr)) @@ -10456,7 +10460,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht) md5_process_bytes (expr, tree_size (expr), ctx); fold_checksum_tree (TREE_TYPE (expr), ctx, ht); if (TREE_CODE_CLASS (code) != tcc_type - && TREE_CODE_CLASS (code) != tcc_declaration) + && TREE_CODE_CLASS (code) != tcc_declaration + && code != TREE_LIST) fold_checksum_tree (TREE_CHAIN (expr), ctx, ht); switch (TREE_CODE_CLASS (code)) { @@ -10484,6 +10489,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht) case TREE_LIST: fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht); fold_checksum_tree (TREE_VALUE (expr), ctx, ht); + expr = TREE_CHAIN (expr); + goto recursive_label; break; case TREE_VEC: for (i = 0; i < TREE_VEC_LENGTH (expr); ++i) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c5f860a7490..2b499e94dd7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-05-31 Andrew pinski + + PR middle-end/20931 + * g++.dg/opt/pr20931.C: New test. + 2005-05-31 Andreas Jaeger PR testsuite/20772 diff --git a/gcc/testsuite/g++.dg/opt/pr20931.C b/gcc/testsuite/g++.dg/opt/pr20931.C new file mode 100644 index 00000000000..01518c06d24 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr20931.C @@ -0,0 +1,13 @@ +// PR middle-end +// This testcase ICEd because fold checking saw a type change which +// is allowed as TYPE_CONTAINS_PLACEHOLDER_INTERNAL could change. +// { dg-do compile } +// { dg-options "-O2" } + +int +__finite (double __x) throw () +{ + return (__extension__ + (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1] + | 0x800fffffu) + 1) >> 31)); +}