diff options
author | Christophe Lyon <christophe.lyon@linaro.org> | 2017-04-03 12:56:48 +0000 |
---|---|---|
committer | Yvan Roux <yvan.roux@linaro.org> | 2017-04-04 07:36:11 +0000 |
commit | 624c82977b9f9b282fdafba776bfd8948afa448e (patch) | |
tree | 4f0f9d6ceaff66f886e4f5904bdb00ebc99c975c /gcc | |
parent | ceed07319cd83eda933ffd6fceaf28ff56c1fff9 (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.md | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr71436.c | 35 |
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); +} |