Commit 3597e113 by Vladimir Makarov Committed by Vladimir Makarov

s390.opt (mlra): New option.

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.

From-SVN: r199754
parent 01037aeb
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> 2013-06-06 Eric Botcazou <ebotcazou@adacore.com>
* config/arm/arm.c (arm_r3_live_at_start_p): New predicate. * config/arm/arm.c (arm_r3_live_at_start_p): New predicate.
......
...@@ -2017,14 +2017,18 @@ s390_decompose_address (rtx addr, struct s390_address *out) ...@@ -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 Thus we don't check the displacement for validity here. If after
elimination the displacement turns out to be invalid after all, elimination the displacement turns out to be invalid after all,
this is fixed up by reload in any case. */ this is fixed up by reload in any case. */
if (base != arg_pointer_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 && indx != arg_pointer_rtx
&& base != return_address_pointer_rtx && base != return_address_pointer_rtx
&& indx != return_address_pointer_rtx && indx != return_address_pointer_rtx
&& base != frame_pointer_rtx && base != frame_pointer_rtx
&& indx != frame_pointer_rtx && indx != frame_pointer_rtx
&& base != virtual_stack_vars_rtx && base != virtual_stack_vars_rtx
&& indx != virtual_stack_vars_rtx) && indx != virtual_stack_vars_rtx))
if (!DISP_IN_RANGE (offset)) if (!DISP_IN_RANGE (offset))
return false; return false;
} }
...@@ -3189,7 +3193,9 @@ s390_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i, ...@@ -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 /* We need a scratch register when loading a PLUS expression which
is not a legitimate operand of the LOAD ADDRESS instruction. */ 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 ? sri->icode = (TARGET_64BIT ?
CODE_FOR_reloaddi_plus : CODE_FOR_reloadsi_plus); CODE_FOR_reloaddi_plus : CODE_FOR_reloadsi_plus);
...@@ -7868,6 +7874,13 @@ s390_class_max_nregs (enum reg_class rclass, enum machine_mode mode) ...@@ -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 (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. */ /* Return true if register FROM can be eliminated via register TO. */
static bool static bool
...@@ -11105,6 +11118,9 @@ s390_loop_unroll_adjust (unsigned nunroll, struct loop *loop) ...@@ -11105,6 +11118,9 @@ s390_loop_unroll_adjust (unsigned nunroll, struct loop *loop)
#undef TARGET_LEGITIMATE_CONSTANT_P #undef TARGET_LEGITIMATE_CONSTANT_P
#define TARGET_LEGITIMATE_CONSTANT_P s390_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 #undef TARGET_CAN_ELIMINATE
#define TARGET_CAN_ELIMINATE s390_can_eliminate #define TARGET_CAN_ELIMINATE s390_can_eliminate
......
...@@ -2690,7 +2690,7 @@ ...@@ -2690,7 +2690,7 @@
"(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)" "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
"#" "#"
[(set_attr "type" "cs") [(set_attr "type" "cs")
(set_attr "cpu_facility" "*,*,z10,*")]) (set_attr "cpu_facility" "*,*,z10,zarch")])
(define_split (define_split
[(set (match_operand:BLK 0 "memory_operand" "") [(set (match_operand:BLK 0 "memory_operand" "")
...@@ -2899,7 +2899,7 @@ ...@@ -2899,7 +2899,7 @@
"(GET_MODE (operands[1]) == Pmode || GET_MODE (operands[1]) == VOIDmode)" "(GET_MODE (operands[1]) == Pmode || GET_MODE (operands[1]) == VOIDmode)"
"#" "#"
[(set_attr "type" "cs") [(set_attr "type" "cs")
(set_attr "cpu_facility" "*,*,z10,*")]) (set_attr "cpu_facility" "*,*,z10,zarch")])
(define_split (define_split
[(set (match_operand:BLK 0 "memory_operand" "") [(set (match_operand:BLK 0 "memory_operand" "")
...@@ -3075,7 +3075,7 @@ ...@@ -3075,7 +3075,7 @@
"(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)" "(GET_MODE (operands[2]) == Pmode || GET_MODE (operands[2]) == VOIDmode)"
"#" "#"
[(set_attr "type" "cs") [(set_attr "type" "cs")
(set_attr "cpu_facility" "*,*,z10,*")]) (set_attr "cpu_facility" "*,*,z10,zarch")])
(define_split (define_split
[(set (reg:CCU CC_REGNUM) [(set (reg:CCU CC_REGNUM)
......
...@@ -149,3 +149,7 @@ Target Report Joined RejectNegative UInteger Var(s390_branch_cost) Init(1) ...@@ -149,3 +149,7 @@ Target Report Joined RejectNegative UInteger Var(s390_branch_cost) Init(1)
Set the branch costs for conditional branch instructions. Reasonable Set the branch costs for conditional branch instructions. Reasonable
values are small, non-negative integers. The default branch cost is values are small, non-negative integers. The default branch cost is
1. 1.
mlra
Target Report Var(s390_lra_flag) Init(1) Save
Use LRA instead of reload
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment