From: Alexandre Oliva Date: Thu, 17 Dec 2009 19:30:58 +0000 (+0000) Subject: re PR debug/41679 (internal compiler error: in loc_cmp, at var-tracking.c:2433) X-Git-Tag: releases/gcc-4.5.0~1590 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00ee9f445b842dfc09b8120e7d45235cd818412e;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90dc2c8088b7..45a97150a60d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-12-17 Alexandre Oliva + + PR debug/41679 + * var-tracking.c (add_stores): Avoid value mode mismatch for + promoted declarations. + 2009-12-17 Jakub Jelinek PR c++/42386 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8ee952212a0..345d6645dee9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-12-17 Alexandre Oliva + + PR debug/41679 + * gcc.target/arm/pr41679.c: New. + 2009-12-17 Jakub Jelinek 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 000000000000..8b248985fe00 --- /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 8267df825eee..11e3aa213a9b 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