aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-11-26 21:54:37 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-11-26 21:54:37 +0100
commit9e3de74cdf7b5c6f3b762299a6492889429931c1 (patch)
tree24e0beaf45dda2fa9d828f649cefe0700c0a2ca9 /gcc
parent5999f07fba49a339bed42319b2a304f521872931 (diff)
downloadgcc-9e3de74cdf7b5c6f3b762299a6492889429931c1.zip
gcc-9e3de74cdf7b5c6f3b762299a6492889429931c1.tar.gz
gcc-9e3de74cdf7b5c6f3b762299a6492889429931c1.tar.bz2
re PR rtl-optimization/59166 (ICE in simplify_subreg, at simplify-rtx.c:5901 on valid code (at -O1 and above with -g enabled))
PR rtl-optimization/59166 * ira.c (find_moveable_pseudos): Use DF_REF_REAL_LOC instead of DF_REF_LOC in validate_change call. (split_live_ranges_for_shrink_wrap): Likewise. * gcc.dg/torture/pr59166.c: New test. From-SVN: r205413
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ira.c6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr59166.c37
4 files changed, 48 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0d97d2e..c2d977e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2013-11-26 Jakub Jelinek <jakub@redhat.com>
+ PR rtl-optimization/59166
+ * ira.c (find_moveable_pseudos): Use DF_REF_REAL_LOC instead of
+ DF_REF_LOC in validate_change call.
+ (split_live_ranges_for_shrink_wrap): Likewise.
+
PR middle-end/59150
* omp-low.c (lower_rec_input_clause): For reduction with placeholder
of references to constant size types in simd loops, defer emitting
diff --git a/gcc/ira.c b/gcc/ira.c
index 2902ebe..cb2d947 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -4812,7 +4812,7 @@ find_moveable_pseudos (void)
{
rtx def_reg = DF_REF_REG (def);
rtx newreg = ira_create_new_reg (def_reg);
- if (validate_change (def_insn, DF_REF_LOC (def), newreg, 0))
+ if (validate_change (def_insn, DF_REF_REAL_LOC (def), newreg, 0))
{
unsigned nregno = REGNO (newreg);
emit_insn_before (gen_move_insn (def_reg, newreg), use_insn);
@@ -5034,7 +5034,7 @@ split_live_ranges_for_shrink_wrap (void)
rtx newreg = NULL_RTX;
df_ref use, next;
- for (use = DF_REG_USE_CHAIN (REGNO(dest)); use; use = next)
+ for (use = DF_REG_USE_CHAIN (REGNO (dest)); use; use = next)
{
rtx uin = DF_REF_INSN (use);
next = DF_REF_NEXT_REG (use);
@@ -5045,7 +5045,7 @@ split_live_ranges_for_shrink_wrap (void)
{
if (!newreg)
newreg = ira_create_new_reg (dest);
- validate_change (uin, DF_REF_LOC (use), newreg, true);
+ validate_change (uin, DF_REF_REAL_LOC (use), newreg, true);
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a00cd97..fc50a05 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2013-11-26 Jakub Jelinek <jakub@redhat.com>
+ PR rtl-optimization/59166
+ * gcc.dg/torture/pr59166.c: New test.
+
PR c++/58874
* g++.dg/gomp/pr58874.C: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr59166.c b/gcc/testsuite/gcc.dg/torture/pr59166.c
new file mode 100644
index 0000000..d29ec33
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr59166.c
@@ -0,0 +1,37 @@
+/* PR rtl-optimization/59166 */
+/* { dg-additional-options "-fcompare-debug" } */
+
+int a, b, c, f, g;
+
+void
+foo ()
+{
+ for (; b; b++)
+ for (; f; f = g)
+ for (; a;)
+ ;
+}
+
+static int
+bar (int p)
+{
+ short d;
+ if (c)
+ {
+ for (; f; f = g);
+ foo ();
+ d = p;
+ char e = d;
+ if (p)
+ return 1;
+ }
+ return p;
+}
+
+int
+main ()
+{
+ bar (0);
+ bar (g);
+ return 0;
+}