aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@linaro.org>2017-04-03 12:56:48 +0000
committerYvan Roux <yvan.roux@linaro.org>2017-04-04 07:36:11 +0000
commit624c82977b9f9b282fdafba776bfd8948afa448e (patch)
tree4f0f9d6ceaff66f886e4f5904bdb00ebc99c975c /gcc
parentceed07319cd83eda933ffd6fceaf28ff56c1fff9 (diff)
gcc/
Backport from trunk r246419. 2017-03-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/71436 * config/arm/arm.md (*load_multiple): Add reload_completed to matching condition. gcc/testsuite/ Backport from trunk r246419. 2017-03-23 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/71436 * gcc.c-torture/compile/pr71436.c: New test. Change-Id: Ia02c434b2f33a91344a496e3ae83fa932ed3e963
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/arm/arm.md5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr71436.c35
2 files changed, 39 insertions, 1 deletions
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 5cc69974388..b097f48d7f6 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -11827,12 +11827,15 @@
;; Patterns in ldmstm.md don't cover more than 4 registers. This pattern covers
;; large lists without explicit writeback generated for APCS_FRAME epilogue.
+;; The operands are validated through the load_multiple_operation
+;; match_parallel predicate rather than through constraints so enable it only
+;; after reload.
(define_insn "*load_multiple"
[(match_parallel 0 "load_multiple_operation"
[(set (match_operand:SI 2 "s_register_operand" "=rk")
(mem:SI (match_operand:SI 1 "s_register_operand" "rk")))
])]
- "TARGET_32BIT"
+ "TARGET_32BIT && reload_completed"
"*
{
arm_output_multireg_pop (operands, /*return_pc=*/false,
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr71436.c b/gcc/testsuite/gcc.c-torture/compile/pr71436.c
new file mode 100644
index 00000000000..ab08d5d369c
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr71436.c
@@ -0,0 +1,35 @@
+/* PR target/71436. */
+
+#pragma pack(1)
+struct S0
+{
+ volatile int f0;
+ short f2;
+};
+
+void foo (struct S0 *);
+int a, d;
+static struct S0 b[5];
+static struct S0 c;
+void fn1 ();
+void
+main ()
+{
+ {
+ struct S0 e;
+ for (; d; fn1 ())
+ {
+ {
+ a = 3;
+ for (; a >= 0; a -= 1)
+ {
+ {
+ e = c;
+ }
+ b[a] = e;
+ }
+ }
+ }
+ }
+ foo (b);
+}