]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/49423 ([arm] internal compiler error: in push_minipool_fix)
authorCharles Baylis <charles.baylis@linaro.org>
Mon, 29 Sep 2014 17:07:47 +0000 (17:07 +0000)
committerCharles Baylis <cbaylis@gcc.gnu.org>
Mon, 29 Sep 2014 17:07:47 +0000 (17:07 +0000)
2014-09-29  Charles Baylis  <charles.baylis@linaro.org>

        Backport from mainline r212303
        PR target/49423
        * config/arm/arm-protos.h (arm_legitimate_address_p,
        arm_is_constant_pool_ref): Add prototypes.
        * config/arm/arm.c (arm_legitimate_address_p): Remove static.
        (arm_is_constant_pool_ref) New function.
        * config/arm/arm.md (unaligned_loadhis, arm_zero_extendhisi2_v6,
        arm_zero_extendqisi2_v6): Use Uh constraint for memory operand.
        (arm_extendhisi2, arm_extendhisi2_v6): Use Uh constraint for memory
        operand and remove pool_range and neg_pool_range attributes.
        (arm_extendqihi_insn, arm_extendqisi, arm_extendqisi_v6): Remove
        pool_range and neg_pool_range attributes.
        * config/arm/constraints.md (Uh): New constraint. (Uq): Don't allow
        constant pool references.

From-SVN: r215686

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c
gcc/config/arm/arm.md
gcc/config/arm/constraints.md

index 466d1806a38bd25b42579023a19e195fcc247f04..86cc14fad27f7d98c70d80b72ac4c9ba2f556d38 100644 (file)
@@ -1,3 +1,20 @@
+2014-09-29  Charles Baylis  <charles.baylis@linaro.org>
+
+       Backport from mainline r212303
+       PR target/49423
+       * config/arm/arm-protos.h (arm_legitimate_address_p,
+       arm_is_constant_pool_ref): Add prototypes.
+       * config/arm/arm.c (arm_legitimate_address_p): Remove static.
+       (arm_is_constant_pool_ref) New function.
+       * config/arm/arm.md (unaligned_loadhis, arm_zero_extendhisi2_v6,
+       arm_zero_extendqisi2_v6): Use Uh constraint for memory operand.
+       (arm_extendhisi2, arm_extendhisi2_v6): Use Uh constraint for memory
+       operand and remove pool_range and neg_pool_range attributes.
+       (arm_extendqihi_insn, arm_extendqisi, arm_extendqisi_v6): Remove
+       pool_range and neg_pool_range attributes.
+       * config/arm/constraints.md (Uh): New constraint. (Uq): Don't allow
+       constant pool references.
+
 2014-09-28  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.c (pa_output_function_epilogue): Only update
index ffa00c0f7b74cdb296158f8459af992f21273843..685af30a4c56f2198bb390fc7fb0dab233b63441 100644 (file)
@@ -55,6 +55,7 @@ extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
 extern int legitimate_pic_operand_p (rtx);
 extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
 extern rtx legitimize_tls_address (rtx, rtx);
+extern bool arm_legitimate_address_p (enum machine_mode, rtx, bool);
 extern int arm_legitimate_address_outer_p (enum machine_mode, rtx, RTX_CODE, int);
 extern int thumb_legitimate_offset_p (enum machine_mode, HOST_WIDE_INT);
 extern bool arm_legitimize_reload_address (rtx *, enum machine_mode, int, int,
@@ -286,4 +287,6 @@ extern bool arm_autoinc_modes_ok_p (enum machine_mode, enum arm_auto_incmodes);
 
 extern void arm_emit_eabi_attribute (const char *, int, int);
 
+extern bool arm_is_constant_pool_ref (rtx);
+
 #endif /* ! GCC_ARM_PROTOS_H */
index e42d0b996ed7d72a9ef85a18e2265d3a3286d3bd..90244292f949942c8183e66d00b77641b67ffec0 100644 (file)
@@ -82,7 +82,6 @@ static rtx arm_legitimize_address (rtx, rtx, enum machine_mode);
 static reg_class_t arm_preferred_reload_class (rtx, reg_class_t);
 static rtx thumb_legitimize_address (rtx, rtx, enum machine_mode);
 inline static int thumb1_index_register_rtx_p (rtx, int);
-static bool arm_legitimate_address_p (enum machine_mode, rtx, bool);
 static int thumb_far_jump_used_p (void);
 static bool thumb_force_lr_save (void);
 static unsigned arm_size_return_regs (void);
@@ -27466,4 +27465,13 @@ arm_validize_comparison (rtx *comparison, rtx * op1, rtx * op2)
 
 }
 
+/* return TRUE if x is a reference to a value in a constant pool */
+extern bool
+arm_is_constant_pool_ref (rtx x)
+{
+  return (MEM_P (x)
+         && GET_CODE (XEXP (x, 0)) == SYMBOL_REF
+         && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)));
+}
+
 #include "gt-arm.h"
index 9050ec838a99b8801be7187eac6b9539f8d9d462..cb910f118c1189bd7fb4a496d0cd3025597110f6 100644 (file)
 (define_insn "unaligned_loadhis"
   [(set (match_operand:SI 0 "s_register_operand" "=l,r")
        (sign_extend:SI
-         (unspec:HI [(match_operand:HI 1 "memory_operand" "Uw,m")]
+         (unspec:HI [(match_operand:HI 1 "memory_operand" "Uw,Uh")]
                     UNSPEC_UNALIGNED_LOAD)))]
   "unaligned_access && TARGET_32BIT"
   "ldr%(sh%)\t%0, %1\t@ unaligned"
 
 (define_insn "*arm_zero_extendhisi2_v6"
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
-       (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
+       (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,Uh")))]
   "TARGET_ARM && arm_arch6"
   "@
    uxth%?\\t%0, %1
 
 (define_insn "*arm_zero_extendqisi2_v6"
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
-       (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,m")))]
+       (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,Uh")))]
   "TARGET_ARM && arm_arch6"
   "@
    uxtb%(%)\\t%0, %1
 
 (define_insn "*arm_extendhisi2"
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
-       (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
+       (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,Uh")))]
   "TARGET_ARM && arm_arch4 && !arm_arch6"
   "@
    #
    ldr%(sh%)\\t%0, %1"
   [(set_attr "length" "8,4")
    (set_attr "type" "alu_shift,load_byte")
-   (set_attr "predicable" "yes")
-   (set_attr "pool_range" "*,256")
-   (set_attr "neg_pool_range" "*,244")]
+   (set_attr "predicable" "yes")]
 )
 
 ;; ??? Check Thumb-2 pool range
 (define_insn "*arm_extendhisi2_v6"
   [(set (match_operand:SI 0 "s_register_operand" "=r,r")
-       (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
+       (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,Uh")))]
   "TARGET_32BIT && arm_arch6"
   "@
    sxth%?\\t%0, %1
    ldr%(sh%)\\t%0, %1"
   [(set_attr "type" "simple_alu_shift,load_byte")
-   (set_attr "predicable" "yes")
-   (set_attr "pool_range" "*,256")
-   (set_attr "neg_pool_range" "*,244")]
+   (set_attr "predicable" "yes")]
 )
 
 (define_insn "*arm_extendhisi2addsi"
   "TARGET_ARM && arm_arch4"
   "ldr%(sb%)\\t%0, %1"
   [(set_attr "type" "load_byte")
-   (set_attr "predicable" "yes")
-   (set_attr "pool_range" "256")
-   (set_attr "neg_pool_range" "244")]
+   (set_attr "predicable" "yes")]
 )
 
 (define_expand "extendqisi2"
    ldr%(sb%)\\t%0, %1"
   [(set_attr "length" "8,4")
    (set_attr "type" "alu_shift,load_byte")
-   (set_attr "predicable" "yes")
-   (set_attr "pool_range" "*,256")
-   (set_attr "neg_pool_range" "*,244")]
+   (set_attr "predicable" "yes")]
 )
 
 (define_insn "*arm_extendqisi_v6"
    sxtb%?\\t%0, %1
    ldr%(sb%)\\t%0, %1"
   [(set_attr "type" "simple_alu_shift,load_byte")
-   (set_attr "predicable" "yes")
-   (set_attr "pool_range" "*,256")
-   (set_attr "neg_pool_range" "*,244")]
+   (set_attr "predicable" "yes")]
 )
 
 (define_insn "*arm_extendqisi2addsi"
index 775f8afd7f30836e283dbe18d090e6d1e24b1322..639439165c05f7d03135b7aa4c51761d028bc5e2 100644 (file)
@@ -36,7 +36,7 @@
 ;; in Thumb-2 state: Pj, PJ, Ps, Pt, Pu, Pv, Pw, Px, Py
 
 ;; The following memory constraints have been used:
-;; in ARM/Thumb-2 state: Q, Ut, Uv, Uy, Un, Um, Us
+;; in ARM/Thumb-2 state: Q, Uh, Ut, Uv, Uy, Un, Um, Us
 ;; in ARM state: Uq
 ;; in Thumb state: Uu, Uw
 
   An address valid for loading/storing register exclusive"
  (match_operand 0 "mem_noofs_operand"))
 
+(define_memory_constraint "Uh"
+ "@internal
+  An address suitable for byte and half-word loads which does not point inside a constant pool"
+ (and (match_code "mem")
+      (match_test "arm_legitimate_address_p (GET_MODE (op), XEXP (op, 0), false) && !arm_is_constant_pool_ref (op)")))
+
 (define_memory_constraint "Ut"
  "@internal
   In ARM/Thumb-2 state an address valid for loading/storing opaque structure
  (and (match_code "mem")
       (match_test "TARGET_ARM
                   && arm_legitimate_address_outer_p (GET_MODE (op), XEXP (op, 0),
-                                                     SIGN_EXTEND, 0)")))
+                                                     SIGN_EXTEND, 0)
+                  && !arm_is_constant_pool_ref (op)")))
 
 (define_memory_constraint "Q"
  "@internal