aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2012-11-28 17:42:39 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2012-11-28 17:42:39 +0000
commitc656b86b8dd3be8a0359aeccf8285dc7b4b065c9 (patch)
tree2f88c081c22debed675f29e747823d688a835fff /gcc
parent77e21230ea18da36f75f83b1428d659ecbbbbd9c (diff)
downloadgcc-c656b86b8dd3be8a0359aeccf8285dc7b4b065c9.zip
gcc-c656b86b8dd3be8a0359aeccf8285dc7b4b065c9.tar.gz
gcc-c656b86b8dd3be8a0359aeccf8285dc7b4b065c9.tar.bz2
re PR rtl-optimization/55512 (Various LRA ICEs with inline-asm)
2012-11-28 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/55512 * lra-assigns.c (assign_by_spills): Assigned arbitrary hard regs to failed reload pseudos instead of changing asm pattern. * lra-constraints.c (MAX_CONSTRAINT_ITERATION_NUMBER): Increase value. 2012-11-28 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/55512 * gcc.target/i386/pr55512-[1234].c: New tests. From-SVN: r193901
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/lra-assigns.c16
-rw-r--r--gcc/lra-constraints.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr55512-1.c14
-rw-r--r--gcc/testsuite/gcc.target/i386/pr55512-2.c16
-rw-r--r--gcc/testsuite/gcc.target/i386/pr55512-3.c15
-rw-r--r--gcc/testsuite/gcc.target/i386/pr55512-4.c17
8 files changed, 88 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 999dfb7..5dfe94a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2012-11-28 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/55512
+ * lra-assigns.c (assign_by_spills): Assigned arbitrary hard regs
+ to failed reload pseudos instead of changing asm pattern.
+ * lra-constraints.c (MAX_CONSTRAINT_ITERATION_NUMBER): Increase
+ value.
+
2012-11-28 Markus Trippelsdorf <markus@trippelsdorf.de>
PR other/55358
@@ -121,7 +129,7 @@
PR rtl-optimization/55458
* lra-assigns.c: Include rtl-error.h.
- (assign_by_spills): Report about asm inpossible constraints.
+ (assign_by_spills): Report about asm impossible constraints.
* Makefile.in (lra-assigns.c): Add $(RTL_ERROR_H).
2012-11-27 Paolo Bonzini <pbonzini@redhat.com>
diff --git a/gcc/lra-assigns.c b/gcc/lra-assigns.c
index 8b7dcff..b1d1810 100644
--- a/gcc/lra-assigns.c
+++ b/gcc/lra-assigns.c
@@ -1220,8 +1220,17 @@ assign_by_spills (void)
bitmap_initialize (&failed_reload_insns, &reg_obstack);
for (i = 0; i < nfails; i++)
- bitmap_ior_into (&failed_reload_insns,
- &lra_reg_info[sorted_pseudos[i]].insn_bitmap);
+ {
+ regno = sorted_pseudos[i];
+ bitmap_ior_into (&failed_reload_insns,
+ &lra_reg_info[regno].insn_bitmap);
+ /* Assign an arbitrary hard register of regno class to
+ avoid further trouble with the asm insns. */
+ bitmap_clear_bit (&all_spilled_pseudos, regno);
+ assign_hard_regno
+ (ira_class_hard_regs[regno_allocno_class_array[regno]][0],
+ regno);
+ }
EXECUTE_IF_SET_IN_BITMAP (&failed_reload_insns, 0, u, bi)
{
insn = lra_insn_recog_data[u]->insn;
@@ -1230,9 +1239,6 @@ assign_by_spills (void)
asm_p = true;
error_for_asm (insn,
"%<asm%> operand has impossible constraints");
- /* Avoid further trouble with this insn. */
- PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
- lra_invalidate_insn_data (insn);
}
}
lra_assert (asm_p);
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 635bb47..128401f 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -3184,7 +3184,7 @@ loc_equivalence_change_p (rtx *loc)
/* Maximum allowed number of constraint pass iterations after the last
spill pass. It is for preventing LRA cycling in a bug case. */
-#define MAX_CONSTRAINT_ITERATION_NUMBER 15
+#define MAX_CONSTRAINT_ITERATION_NUMBER 30
/* Maximum number of generated reload insns per an insn. It is for
preventing this pass cycling in a bug case. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7625ec2..d9bde0a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-11-28 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/55512
+ * gcc.target/i386/pr55512-[1234].c: New tests.
+
2012-11-28 Jakub Jelinek <jakub@redhat.com>
PR testsuite/55505
diff --git a/gcc/testsuite/gcc.target/i386/pr55512-1.c b/gcc/testsuite/gcc.target/i386/pr55512-1.c
new file mode 100644
index 0000000..de88f60
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr55512-1.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+foo (int x)
+{
+ asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+ "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+ "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+ "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15) : : lab);
+ __builtin_unreachable ();
+ lab:
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr55512-2.c b/gcc/testsuite/gcc.target/i386/pr55512-2.c
new file mode 100644
index 0000000..eec2a88
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr55512-2.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#define __builtin_unreachable() do { } while (0)
+
+int
+foo (int x)
+{
+ asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+ "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+ "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+ "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15) : : lab);
+ __builtin_unreachable ();
+ lab:
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr55512-3.c b/gcc/testsuite/gcc.target/i386/pr55512-3.c
new file mode 100644
index 0000000..2a351c3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr55512-3.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+bar (int x)
+{
+ asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+ "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+ "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+ "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15),
+ "r" (x + 16) : : lab);
+ __builtin_unreachable ();
+ lab:
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr55512-4.c b/gcc/testsuite/gcc.target/i386/pr55512-4.c
new file mode 100644
index 0000000..3fcd11c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr55512-4.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#define __builtin_unreachable() do { } while (0)
+
+int
+bar (int x)
+{
+ asm goto ("" : : "r" (x), "r" (x + 1), "r" (x + 2), "r" (x + 3), /* { dg-error "operand has impossible constraints" } */
+ "r" (x + 4), "r" (x + 5), "r" (x + 6), "r" (x + 7),
+ "r" (x + 8), "r" (x + 9), "r" (x + 10), "r" (x + 11),
+ "r" (x + 12), "r" (x + 13), "r" (x + 14), "r" (x + 15),
+ "r" (x + 16) : : lab);
+ __builtin_unreachable ();
+ lab:
+ return 0;
+}