From: H.J. Lu Date: Tue, 9 Sep 2008 23:58:57 +0000 (-0700) Subject: re PR rtl-optimization/37435 (ICE with volatiles) X-Git-Tag: releases/gcc-4.4.0~2524 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c3c96e682fa283b5ea08faa30aa5eb2a93f08fd3;p=thirdparty%2Fgcc.git re PR rtl-optimization/37435 (ICE with volatiles) gcc/ 2008-09-09 Vladimir Makarov PR rtl-optimization/37435 * caller-save.c (insert_restore, insert_save): Check the mode by reg_save_code. gcc/testsuite/ 2008-09-09 H.J. Lu PR rtl-optimization/37435 * gcc.dg/dfp/pr37435.c: New. From-SVN: r140184 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7178941e1463..d07d85d0e291 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-09 Vladimir Makarov + + PR rtl-optimization/37435 + * caller-save.c (insert_restore, insert_save): Check the mode by + reg_save_code. + 2008-09-09 John David Anglin PR other/37265 diff --git a/gcc/caller-save.c b/gcc/caller-save.c index ee8a0dc66312..2d0925a4686e 100644 --- a/gcc/caller-save.c +++ b/gcc/caller-save.c @@ -1067,7 +1067,10 @@ insert_restore (struct insn_chain *chain, int before_p, int regno, mem = regno_save_mem [regno][numregs]; if (save_mode [regno] != VOIDmode && save_mode [regno] != GET_MODE (mem) - && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]]) + && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]] + /* Check that insn to restore REGNO in save_mode[regno] is + correct. */ + && reg_save_code (regno, save_mode[regno]) >= 0) mem = adjust_address (mem, save_mode[regno], 0); else mem = copy_rtx (mem); @@ -1145,7 +1148,10 @@ insert_save (struct insn_chain *chain, int before_p, int regno, mem = regno_save_mem [regno][numregs]; if (save_mode [regno] != VOIDmode && save_mode [regno] != GET_MODE (mem) - && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]]) + && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]] + /* Check that insn to save REGNO in save_mode[regno] is + correct. */ + && reg_save_code (regno, save_mode[regno]) >= 0) mem = adjust_address (mem, save_mode[regno], 0); else mem = copy_rtx (mem); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6e14ee51bd9c..4f1f9e07a732 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-09 H.J. Lu + + PR rtl-optimization/37435 + * gcc.dg/dfp/pr37435.c: New. + 2008-09-09 Jakub Jelinek PR c++/37417 diff --git a/gcc/testsuite/gcc.dg/dfp/pr37435.c b/gcc/testsuite/gcc.dg/dfp/pr37435.c new file mode 100644 index 000000000000..98acc9c118bd --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/pr37435.c @@ -0,0 +1,11 @@ +/* { dg-do compile { target fpic } } */ +/* { dg-options "-std=gnu99 -O2 -fPIC" } */ + +volatile _Decimal32 d; +volatile int i; + +void foo() +{ + d += i; + d += i; +}