diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dcba2c1972a..8b0b58ef3c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-03-13 Eric Botcazou + + PR middle-end/14470 + * expr.c (store_expr): Call emit_queue before generating the move + from the temporary to the original target. Protect the temporary + from emit_queue. + 2004-03-13 Jakub Jelinek PR target/14533 diff --git a/gcc/expr.c b/gcc/expr.c index d5267505c6b..46140bbf3e4 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -4245,7 +4245,9 @@ store_expr (tree exp, rtx target, int want_value) bit-initialized. */ && expr_size (exp) != const0_rtx) { + emit_queue(); target = protect_from_queue (target, 1); + temp = protect_from_queue (temp, 0); if (GET_MODE (temp) != GET_MODE (target) && GET_MODE (temp) != VOIDmode) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2d03db8ff5f..7a113afdc88 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-03-13 Eric Botcazou + + * gcc.c-torture/execute/20040313-1.c: New test. + 2004-03-13 Jakub Jelinek PR target/14533 @@ -21388,3 +21392,4 @@ rlsruhe.de> correspond to c-torture 1.11. * New file. + diff --git a/gcc/testsuite/gcc.c-torture/execute/20040313-1.c b/gcc/testsuite/gcc.c-torture/execute/20040313-1.c new file mode 100644 index 00000000000..c05fe730f0c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20040313-1.c @@ -0,0 +1,17 @@ +/* PR middle-end/14470 */ +/* Origin: Lodewijk Voge */ + +extern void abort(void); + +int main() +{ + int t[1025] = { 1024 }, d; + + d = 0; + d = t[d]++; + if (t[0] != 1025) + abort(); + if (d != 1024) + abort(); + return 0; +}