diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2009-12-17 19:30:58 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-12-17 20:30:58 +0100 |
commit | 00ee9f445b842dfc09b8120e7d45235cd818412e (patch) | |
tree | 7de22c79741e0248541d337275089b1d426b896f /gcc | |
parent | 3fd54fb075d6e0639027fbfa0669e240ff73f262 (diff) | |
download | gcc-00ee9f445b842dfc09b8120e7d45235cd818412e.zip gcc-00ee9f445b842dfc09b8120e7d45235cd818412e.tar.gz gcc-00ee9f445b842dfc09b8120e7d45235cd818412e.tar.bz2 |
re PR debug/41679 (internal compiler error: in loc_cmp, at var-tracking.c:2433)
PR debug/41679
* var-tracking.c (add_stores): Avoid value mode mismatch for
promoted declarations.
* gcc.target/arm/pr41679.c: New.
From-SVN: r155322
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/pr41679.c | 16 | ||||
-rw-r--r-- | gcc/var-tracking.c | 26 |
4 files changed, 46 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90dc2c8..45a9715 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-12-17 Alexandre Oliva <aoliva@redhat.com> + + PR debug/41679 + * var-tracking.c (add_stores): Avoid value mode mismatch for + promoted declarations. + 2009-12-17 Jakub Jelinek <jakub@redhat.com> PR c++/42386 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8ee952..345d664 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-12-17 Alexandre Oliva <aoliva@redhat.com> + + PR debug/41679 + * gcc.target/arm/pr41679.c: New. + 2009-12-17 Jakub Jelinek <jakub@redhat.com> PR c++/42386 diff --git a/gcc/testsuite/gcc.target/arm/pr41679.c b/gcc/testsuite/gcc.target/arm/pr41679.c new file mode 100644 index 0000000..8b24898 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr41679.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv5te -g -O2" } */ + +extern int a; +extern char b; +extern int foo (void); + +void +test (void) +{ + int c; + b = foo () ? '~' : '\0'; + while ((c = foo ())) + if (c == '7') + a = 0; +} diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 8267df8..11e3aa2 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -4815,13 +4815,15 @@ add_stores (rtx loc, const_rtx expr, void *cuip) } else { + rtx xexpr = CONST_CAST_RTX (expr); + if (SET_SRC (expr) != src) - expr = gen_rtx_SET (VOIDmode, loc, src); + xexpr = gen_rtx_SET (VOIDmode, loc, src); if (same_variable_part_p (src, REG_EXPR (loc), REG_OFFSET (loc))) mo->type = MO_COPY; else mo->type = MO_SET; - mo->u.loc = CONST_CAST_RTX (expr); + mo->u.loc = xexpr; } } mo->insn = cui->insn; @@ -4872,15 +4874,17 @@ add_stores (rtx loc, const_rtx expr, void *cuip) } else { + rtx xexpr = CONST_CAST_RTX (expr); + if (SET_SRC (expr) != src) - expr = gen_rtx_SET (VOIDmode, loc, src); - if (same_variable_part_p (SET_SRC (expr), + xexpr = gen_rtx_SET (VOIDmode, loc, src); + if (same_variable_part_p (SET_SRC (xexpr), MEM_EXPR (loc), INT_MEM_OFFSET (loc))) mo->type = MO_COPY; else mo->type = MO_SET; - mo->u.loc = CONST_CAST_RTX (expr); + mo->u.loc = xexpr; } } mo->insn = cui->insn; @@ -4901,7 +4905,14 @@ add_stores (rtx loc, const_rtx expr, void *cuip) if (resolve && GET_CODE (mo->u.loc) == SET) { - nloc = replace_expr_with_values (SET_SRC (mo->u.loc)); + nloc = replace_expr_with_values (SET_SRC (expr)); + + /* Avoid the mode mismatch between oexpr and expr. */ + if (!nloc && mode != mode2) + { + nloc = SET_SRC (expr); + gcc_assert (oloc == SET_DEST (expr)); + } if (nloc) oloc = gen_rtx_SET (GET_MODE (mo->u.loc), oloc, nloc); @@ -4940,7 +4951,8 @@ add_stores (rtx loc, const_rtx expr, void *cuip) (concat (concat val dstv) (set dst src)): dst now holds val, copied from src. dstv is a value-based representation of dst, if - it differs from dst. If resolution is needed, src is a REG. + it differs from dst. If resolution is needed, src is a REG, and + its mode is the same as that of val. (concat (concat val (set dstv srcv)) (set dst src)): src copied to dst, holding val. dstv and srcv are value-based |