aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@linaro.org>2020-02-25 15:54:14 +0000
committerChristophe Lyon <christophe.lyon@linaro.org>2020-02-25 15:54:14 +0000
commita71f2193d0df71a86c4743aab22891bb0003112e (patch)
treea639ee88ae4d7bbd52678e5b69c83e01995303b0 /gcc
parent73dc4ae47418aef2eb470b8f71cef57dce37349e (diff)
downloadgcc-a71f2193d0df71a86c4743aab22891bb0003112e.zip
gcc-a71f2193d0df71a86c4743aab22891bb0003112e.tar.gz
gcc-a71f2193d0df71a86c4743aab22891bb0003112e.tar.bz2
[ARM] Fix -mpure-code for v6m
When running the testsuite with -fdisable-rtl-fwprop2 and -mpure-code for cortex-m0, I noticed that some testcases were failing because we still generate "ldr rX, .LCY", which is what we want to avoid with -mpure-code. This is latent since a recent improvement in fwprop (PR88833). In this patch I change the thumb1_movsi_insn pattern so that it emits the desired instruction sequence when arm_disable_literal_pool is set. To achieve that, I introduce a new required_for_purecode attribute to enable the corresponding alternative in thumb1_movsi_insn and take the actual instruction sequence length into account. gcc/ChangeLog: 2020-02-13 Christophe Lyon <christophe.lyon@linaro.org> * config/arm/arm.md (required_for_purecode): New attribute. (enabled): Handle required_for_purecode. * config/arm/thumb1.md (thumb1_movsi_insn): Add alternative to work with -mpure-code.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/arm/arm.md9
-rw-r--r--gcc/config/arm/thumb1.md16
3 files changed, 25 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 78a8d94..14a4b1a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2020-02-25 Christophe Lyon <christophe.lyon@linaro.org>
+
+ * config/arm/arm.md (required_for_purecode): New attribute.
+ (enabled): Handle required_for_purecode.
+ * config/arm/thumb1.md (thumb1_movsi_insn): Add alternative to
+ work with -mpure-code.
+
2020-02-25 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/93908
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 9515962..b48a4f4 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -97,6 +97,11 @@
; an IT block in their expansion which is not a short IT.
(define_attr "enabled_for_short_it" "no,yes" (const_string "yes"))
+; Mark an instruction sequence as the required way of loading a
+; constant when -mpure-code is enabled (which implies
+; arm_disable_literal_pool)
+(define_attr "required_for_purecode" "no,yes" (const_string "no"))
+
;; Operand number of an input operand that is shifted. Zero if the
;; given instruction does not shift one of its input operands.
(define_attr "shift" "" (const_int 0))
@@ -230,6 +235,10 @@
(match_test "arm_restrict_it"))
(const_string "no")
+ (and (eq_attr "required_for_purecode" "yes")
+ (not (match_test "arm_disable_literal_pool")))
+ (const_string "no")
+
(eq_attr "arch_enabled" "no")
(const_string "no")]
(const_string "yes")))
diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
index 613cf9c..2486163 100644
--- a/gcc/config/arm/thumb1.md
+++ b/gcc/config/arm/thumb1.md
@@ -691,8 +691,8 @@
)
(define_insn "*thumb1_movsi_insn"
- [(set (match_operand:SI 0 "nonimmediate_operand" "=l,l,r,l,l,l,>,l, m,*l*h*k")
- (match_operand:SI 1 "general_operand" "l, I,j,J,K,>,l,mi,l,*l*h*k"))]
+ [(set (match_operand:SI 0 "nonimmediate_operand" "=l,l,r,l,l,l,>,l, l, m,*l*h*k")
+ (match_operand:SI 1 "general_operand" "l, I,j,J,K,>,l,i, mi,l,*l*h*k"))]
"TARGET_THUMB1
&& ( register_operand (operands[0], SImode)
|| register_operand (operands[1], SImode))"
@@ -704,14 +704,16 @@
#
ldmia\\t%1, {%0}
stmia\\t%0, {%1}
+ movs\\t%0, #:upper8_15:%1; lsls\\t%0, #8; adds\\t%0, #:upper0_7:%1; lsls\\t%0, #8; adds\\t%0, #:lower8_15:%1; lsls\\t%0, #8; adds\\t%0, #:lower0_7:%1
ldr\\t%0, %1
str\\t%1, %0
mov\\t%0, %1"
- [(set_attr "length" "2,2,4,4,4,2,2,2,2,2")
- (set_attr "type" "mov_reg,mov_imm,mov_imm,multiple,multiple,load_4,store_4,load_4,store_4,mov_reg")
- (set_attr "pool_range" "*,*,*,*,*,*,*,1018,*,*")
- (set_attr "arch" "t1,t1,v8mb,t1,t1,t1,t1,t1,t1,t1")
- (set_attr "conds" "set,clob,nocond,*,*,nocond,nocond,nocond,nocond,nocond")])
+ [(set_attr "length" "2,2,4,4,4,2,2,14,2,2,2")
+ (set_attr "type" "mov_reg,mov_imm,mov_imm,multiple,multiple,load_4,store_4,alu_sreg,load_4,store_4,mov_reg")
+ (set_attr "pool_range" "*,*,*,*,*,*,*, *,1018,*,*")
+ (set_attr "arch" "t1,t1,v8mb,t1,t1,t1,t1,t1,t1,t1,t1")
+ (set_attr "required_for_purecode" "no,no,no,no,no,no,no,yes,no,no,no")
+ (set_attr "conds" "set,clob,nocond,*,*,nocond,nocond,nocond,nocond,nocond,nocond")])
; Split the load of 64-bit constant into two loads for high and low 32-bit parts respectively
; to see if we can load them in fewer instructions or fewer cycles.