mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-16 04:40:25 +08:00
re PR middle-end/31579 (ICE when compiling attached code)
2007-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com> PR middle-end/31579 * expr.c (expand_expr_addr_expr_1): Call expand_expr for the offset with the modifier as EXPAND_INITIALIZER if the modifier is EXPAND_INITIALIZER. (expand_expr_real_1 <case INTEGER_CST>): Don't force to a register if we had an overflow. 2007-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com> PR middle-end/31579 * g++.dg/torture/pr31579.C: New testcase. From-SVN: r125655
This commit is contained in:
parent
4c8c70e06a
commit
4543943ad4
@ -1,3 +1,12 @@
|
||||
2007-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com>
|
||||
|
||||
PR middle-end/31579
|
||||
* expr.c (expand_expr_addr_expr_1): Call expand_expr
|
||||
for the offset with the modifier as EXPAND_INITIALIZER
|
||||
if the modifier is EXPAND_INITIALIZER.
|
||||
(expand_expr_real_1 <case INTEGER_CST>): Don't force to
|
||||
a register if we had an overflow.
|
||||
|
||||
2007-06-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
|
||||
|
||||
* real.c (real_isfinite): New.
|
||||
|
13
gcc/expr.c
13
gcc/expr.c
@ -6695,7 +6695,9 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
|
||||
|
||||
if (modifier != EXPAND_NORMAL)
|
||||
result = force_operand (result, NULL);
|
||||
tmp = expand_expr (offset, NULL_RTX, tmode, EXPAND_NORMAL);
|
||||
tmp = expand_expr (offset, NULL_RTX, tmode,
|
||||
modifier == EXPAND_INITIALIZER
|
||||
? EXPAND_INITIALIZER : EXPAND_NORMAL);
|
||||
|
||||
result = convert_memory_address (tmode, result);
|
||||
tmp = convert_memory_address (tmode, tmp);
|
||||
@ -7118,15 +7120,6 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
|
||||
temp = immed_double_const (TREE_INT_CST_LOW (exp),
|
||||
TREE_INT_CST_HIGH (exp), mode);
|
||||
|
||||
/* ??? If overflow is set, fold will have done an incomplete job,
|
||||
which can result in (plus xx (const_int 0)), which can get
|
||||
simplified by validate_replace_rtx during virtual register
|
||||
instantiation, which can result in unrecognizable insns.
|
||||
Avoid this by forcing all overflows into registers. */
|
||||
if (TREE_OVERFLOW (exp)
|
||||
&& modifier != EXPAND_INITIALIZER)
|
||||
temp = force_reg (mode, temp);
|
||||
|
||||
return temp;
|
||||
|
||||
case VECTOR_CST:
|
||||
|
@ -1,3 +1,8 @@
|
||||
2007-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com>
|
||||
|
||||
PR middle-end/31579
|
||||
* g++.dg/torture/pr31579.C: New testcase.
|
||||
|
||||
2007-06-12 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
PR libstdc++/29286
|
||||
|
10
gcc/testsuite/g++.dg/torture/pr31579.C
Normal file
10
gcc/testsuite/g++.dg/torture/pr31579.C
Normal file
@ -0,0 +1,10 @@
|
||||
/* { dg-do compile } */
|
||||
// middle-end/31579
|
||||
// Expand was crashing while expanding the tree for the initializer
|
||||
|
||||
struct Industry {
|
||||
unsigned char produced_cargo[2];
|
||||
};
|
||||
unsigned int a = (((unsigned long)&reinterpret_cast<const volatile
|
||||
char&>((((Industry*)(char*)8)->produced_cargo[0]))) - 8);
|
||||
|
Loading…
x
Reference in New Issue
Block a user