]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2013-06-06 Vladimir Makarov <vmakarov@redhat.com>
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Jun 2013 20:05:16 +0000 (20:05 +0000)
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Jun 2013 20:05:16 +0000 (20:05 +0000)
* config/s390/s390.opt (mlra): New option.
* config/s390/s390.c (s390_decompose_address): Check displacement
for all registers for LRA.
(s390_secondary_reload): Don't used secondary reloads for LRA.
(s390_lra_p): New function.
(TARGET_LRA_P): Define.
* config/s390/s390.md (*movmem_short, *clrmem_short): Change value
of attribute cpu_facility to zarch for the last alternative.
(*cmpmem_short): Ditto.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199754 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/config/s390/s390.md
gcc/config/s390/s390.opt

index 787da6fbd031b68f97c5741a57296d6c2fb82f1e..6fe6b6dc1ed1d15903677de60e0e8a29e2e27c86 100644 (file)
@@ -1,3 +1,15 @@
+2013-06-06  Vladimir Makarov  <vmakarov@redhat.com>
+
+       * config/s390/s390.opt (mlra): New option.
+       * config/s390/s390.c (s390_decompose_address): Check displacement
+       for all registers for LRA.
+       (s390_secondary_reload): Don't used secondary reloads for LRA.
+       (s390_lra_p): New function.
+       (TARGET_LRA_P): Define.
+       * config/s390/s390.md (*movmem_short, *clrmem_short): Change value
+       of attribute cpu_facility to zarch for the last alternative.
+       (*cmpmem_short): Ditto.
+
 2013-06-06  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/arm/arm.c (arm_r3_live_at_start_p): New predicate.
index 30c34901f8d4f25bd08617380f4591de6206ed6d..358345a4437a2328b8d48223daf0e27c468f7862 100644 (file)
@@ -2017,14 +2017,18 @@ s390_decompose_address (rtx addr, struct s390_address *out)
         Thus we don't check the displacement for validity here.  If after
         elimination the displacement turns out to be invalid after all,
         this is fixed up by reload in any case.  */
-      if (base != arg_pointer_rtx
-         && indx != arg_pointer_rtx
-         && base != return_address_pointer_rtx
-         && indx != return_address_pointer_rtx
-         && base != frame_pointer_rtx
-         && indx != frame_pointer_rtx
-         && base != virtual_stack_vars_rtx
-         && indx != virtual_stack_vars_rtx)
+      /* LRA maintains always displacements up to date and we need to
+        know the displacement is right during all LRA not only at the
+        final elimination.  */
+      if (lra_in_progress
+         || (base != arg_pointer_rtx
+             && indx != arg_pointer_rtx
+             && base != return_address_pointer_rtx
+             && indx != return_address_pointer_rtx
+             && base != frame_pointer_rtx
+             && indx != frame_pointer_rtx
+             && base != virtual_stack_vars_rtx
+             && indx != virtual_stack_vars_rtx))
        if (!DISP_IN_RANGE (offset))
          return false;
     }
@@ -3189,7 +3193,9 @@ s390_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
 
   /* We need a scratch register when loading a PLUS expression which
      is not a legitimate operand of the LOAD ADDRESS instruction.  */
-  if (in_p && s390_plus_operand (x, mode))
+  /* LRA can deal with transformation of plus op very well -- so we
+     don't need to prompt LRA in this case.  */
+  if (! lra_in_progress && in_p && s390_plus_operand (x, mode))
     sri->icode = (TARGET_64BIT ?
                  CODE_FOR_reloaddi_plus : CODE_FOR_reloadsi_plus);
 
@@ -7868,6 +7874,13 @@ s390_class_max_nregs (enum reg_class rclass, enum machine_mode mode)
   return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
 }
 
+/* Return true if we use LRA instead of reload pass.  */
+static bool
+s390_lra_p (void)
+{
+  return s390_lra_flag;
+}
+
 /* Return true if register FROM can be eliminated via register TO.  */
 
 static bool
@@ -11105,6 +11118,9 @@ s390_loop_unroll_adjust (unsigned nunroll, struct loop *loop)
 #undef TARGET_LEGITIMATE_CONSTANT_P
 #define TARGET_LEGITIMATE_CONSTANT_P s390_legitimate_constant_p
 
+#undef TARGET_LRA_P
+#define TARGET_LRA_P s390_lra_p
+
 #undef TARGET_CAN_ELIMINATE
 #define TARGET_CAN_ELIMINATE s390_can_eliminate
 
index cad4f5f579a76e88218486b46bcba08ac3dec48e..9279dfa971d1d05ee7a7949ed7d3dfc15938a6b9 100644 (file)
   "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
   "#"
   [(set_attr "type"         "cs")
-   (set_attr "cpu_facility" "*,*,z10,*")])
+   (set_attr "cpu_facility" "*,*,z10,zarch")])
 
 (define_split
   [(set (match_operand:BLK 0 "memory_operand" "")
   "(GET_MODE (operands[1]) == Pmode || GET_MODE (operands[1]) == VOIDmode)"
   "#"
   [(set_attr "type" "cs")
-   (set_attr "cpu_facility" "*,*,z10,*")])
+   (set_attr "cpu_facility" "*,*,z10,zarch")])
 
 (define_split
   [(set (match_operand:BLK 0 "memory_operand" "")
   "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
   "#"
   [(set_attr "type" "cs")
-   (set_attr "cpu_facility" "*,*,z10,*")])
+   (set_attr "cpu_facility" "*,*,z10,zarch")])
 
 (define_split
   [(set (reg:CCU CC_REGNUM)
index b326441173c75849e645e965b98b09b98ed4d838..ba38e6e14ed3e680de8ba07e2cd931a84e04ed2a 100644 (file)
@@ -149,3 +149,7 @@ Target Report Joined RejectNegative UInteger Var(s390_branch_cost) Init(1)
 Set the branch costs for conditional branch instructions.  Reasonable
 values are small, non-negative integers.  The default branch cost is
 1.
+
+mlra
+Target Report Var(s390_lra_flag) Init(1) Save
+Use LRA instead of reload