aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2009-12-17 19:30:58 +0000
committerJakub Jelinek <jakub@gcc.gnu.org>2009-12-17 20:30:58 +0100
commit00ee9f445b842dfc09b8120e7d45235cd818412e (patch)
tree7de22c79741e0248541d337275089b1d426b896f /gcc
parent3fd54fb075d6e0639027fbfa0669e240ff73f262 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/arm/pr41679.c16
-rw-r--r--gcc/var-tracking.c26
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