[multiple changes]
2005-05-31 Andrew pinski <pinskia@physics.uc.edu> PR middle-end/20931 * g++.dg/opt/pr20931.C: New test. 2005-05-31 Andrew Pinski <pinskia@physics.uc.edu> 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
This commit is contained in:
parent
fb03baf210
commit
d763bb1005
4 changed files with 37 additions and 2 deletions
|
@ -1,3 +1,13 @@
|
|||
2005-05-31 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
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 <pinskia@physics.uc.edu>
|
||||
|
||||
PR tree-opt/21732
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2005-05-31 Andrew pinski <pinskia@physics.uc.edu>
|
||||
|
||||
PR middle-end/20931
|
||||
* g++.dg/opt/pr20931.C: New test.
|
||||
|
||||
2005-05-31 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
PR testsuite/20772
|
||||
|
|
13
gcc/testsuite/g++.dg/opt/pr20931.C
Normal file
13
gcc/testsuite/g++.dg/opt/pr20931.C
Normal file
|
@ -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));
|
||||
}
|
Loading…
Add table
Reference in a new issue