diff mbox

[AArch64] Cleanup add expander

Message ID AM5PR0802MB26109D75AEB8CBAF3F0546BE83A90@AM5PR0802MB2610.eurprd08.prod.outlook.com
State New
Headers show

Commit Message

Wilco Dijkstra Oct. 24, 2016, 4:19 p.m. UTC
The add expander still contains some expansion code that was required for the
previous prolog/epilog code, but which is no longer needed.  I also noticed that
the current version splits off immediates from frame addressing instructions,
which doesn't seem a good idea.  Avoiding this resulted in small codesize 
improvements.

ChangeLog:
2016-10-24  Wilco Dijkstra  <wdijkstr@arm.com>

    gcc/
	* config/aarch64/aarch64.md (add<mode>3): Remove
	redundant code.  Don't split frame based additions.
--

Comments

James Greenhalgh Nov. 1, 2016, 6:07 p.m. UTC | #1
On Mon, Oct 24, 2016 at 04:19:47PM +0000, Wilco Dijkstra wrote:
> The add expander still contains some expansion code that was required for the
> previous prolog/epilog code, but which is no longer needed.  I also noticed that
> the current version splits off immediates from frame addressing instructions,
> which doesn't seem a good idea.  Avoiding this resulted in small codesize 
> improvements.


OK, but...

> ChangeLog:
> 2016-10-24  Wilco Dijkstra  <wdijkstr@arm.com>
> 
>     gcc/
> 	* config/aarch64/aarch64.md (add<mode>3): Remove
> 	redundant code.  Don't split frame based additions.


> +  /* If the constant is too large for a single instruction and isn't frame
> +     based, split off the immediate so it is available for CSE.  */
> +  if (!aarch64_plus_immediate (operands[2], <MODE>mode)
> +      && can_create_pseudo_p () && !REGNO_PTR_FRAME_P (REGNO (operands[1])))

Split the second && on to a newline:

> +  if (!aarch64_plus_immediate (operands[2], <MODE>mode)
> +      && can_create_pseudo_p ()
> +      && !REGNO_PTR_FRAME_P (REGNO (operands[1])))

As so.

Thanks,
James
diff mbox

Patch

diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 89e932ae104e9fccb3fbd4af0fbb4a4414e0542e..13a162caae2b93221939bd34a7c01f5da2d4be9e 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -1586,25 +1586,11 @@ 
 	      (match_operand:GPI 2 "aarch64_pluslong_operand" "")))]
   ""
 {
-  if (aarch64_pluslong_strict_immedate (operands[2], <MODE>mode))
-    {
-      /* Give CSE the opportunity to share this constant across additions.  */
-      if (!cse_not_expected && can_create_pseudo_p ())
-        operands[2] = force_reg (<MODE>mode, operands[2]);
-
-      /* Split will refuse to operate on a modification to the stack pointer.
-	 Aid the prologue and epilogue expanders by splitting this now.  */
-      else if (reload_completed && operands[0] == stack_pointer_rtx)
-	{
-	  HOST_WIDE_INT i = INTVAL (operands[2]);
-	  HOST_WIDE_INT s = (i >= 0 ? i & 0xfff : -(-i & 0xfff));
-	  emit_insn (gen_rtx_SET (operands[0],
-				  gen_rtx_PLUS (<MODE>mode, operands[1],
-						GEN_INT (i - s))));
-	  operands[1] = operands[0];
-	  operands[2] = GEN_INT (s);
-	}
-    }
+  /* If the constant is too large for a single instruction and isn't frame
+     based, split off the immediate so it is available for CSE.  */
+  if (!aarch64_plus_immediate (operands[2], <MODE>mode)
+      && can_create_pseudo_p () && !REGNO_PTR_FRAME_P (REGNO (operands[1])))
+    operands[2] = force_reg (<MODE>mode, operands[2]);
 })
 
 (define_insn "*add<mode>3_aarch64"