[mid-end,__RTL] Set global epilogue_completed in skip_pass
diff mbox series

Message ID HE1PR0802MB2251C0DC87116729DFC5FFD1E0700@HE1PR0802MB2251.eurprd08.prod.outlook.com
State New
Headers show
Series
  • [mid-end,__RTL] Set global epilogue_completed in skip_pass
Related show

Commit Message

Matthew Malcomson Nov. 15, 2019, noon UTC
Set global epilogue_completed when skipping pro_and_epilogue pass

When compiling RTL functions marked to start at a pass after the reload
pass, `skip_pass` is used to mark the reload pass as having completed
since many patterns use the `reload_completed` variable to determine
whether to run or not.

Here we do the same for the `epilogue_completed` variable and the
pro_and_epilogue pass.

Also include a testcase that relies on the availability of a
define_split in the aarch64 backend that is conditioned on this
`epilogue_completed` variable.

regtest done on native aarch64
regtest done on native x64_86

gcc/ChangeLog:

2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>

	* passes.c (skip_pass): Set epilogue_completed if skipping the
	pro_and_epilogue pass.

gcc/testsuite/ChangeLog:

2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>

	* gcc.dg/rtl/aarch64/test-epilogue-set.c: New test.



###############     Attachment also inlined for ease of reply    ###############
diff --git a/gcc/passes.c b/gcc/passes.c
index f838b586bff2bef6b075e7f7d59837bb3da00683..1851759349ced0f043cb3f5cb5e685ae4e05a95e 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -2388,6 +2388,11 @@ skip_pass (opt_pass *pass)
   if (strcmp (pass->name, "reload") == 0)
     reload_completed = 1;
 
+  /* Similar for pass "pro_and_epilogue" and the "epilogue_completed" global
+     variable.  */
+  if (strcmp (pass->name, "pro_and_epilogue") == 0)
+    epilogue_completed = 1;
+
   /* The INSN_ADDRESSES vec is normally set up by
      shorten_branches; set it up for the benefit of passes that
      run after this.  */
diff --git a/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c b/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c
new file mode 100644
index 0000000000000000000000000000000000000000..e0b893c066771493c0b71bf70efa9e454f5c8131
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c
@@ -0,0 +1,25 @@
+/* { dg-do compile { target aarch64-*-* } } */
+
+/*
+   Should compile rather than ICE.
+   Compilation requires setting the "epilogue_completed" variable.
+ */
+int __RTL (startwith ("cprop_hardreg"))
+f ()
+{
+(function "f"
+  (insn-chain
+    (block 2
+      (edge-from entry (flags "FALLTHRU"))
+      (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK)
+      (cinsn 100 (set (reg:DI x0)
+		  (plus:DI
+		   (reg:DI x1)
+		   (const_int 16777213))))
+      ;; Extra insn, to avoid all of the above from being deleted by DCE
+      (cinsn 10 (use (reg/i:DI x0)))
+      (edge-to exit (flags "FALLTHRU"))
+    ) ;; block 2
+  ) ;; insn-chain
+) ;; function
+}

Comments

Richard Biener Nov. 15, 2019, 12:07 p.m. UTC | #1
On Fri, 15 Nov 2019, Matthew Malcomson wrote:

> Set global epilogue_completed when skipping pro_and_epilogue pass
> 
> When compiling RTL functions marked to start at a pass after the reload
> pass, `skip_pass` is used to mark the reload pass as having completed
> since many patterns use the `reload_completed` variable to determine
> whether to run or not.
> 
> Here we do the same for the `epilogue_completed` variable and the
> pro_and_epilogue pass.
> 
> Also include a testcase that relies on the availability of a
> define_split in the aarch64 backend that is conditioned on this
> `epilogue_completed` variable.
> 
> regtest done on native aarch64
> regtest done on native x64_86

OK.

Richard.

> gcc/ChangeLog:
> 
> 2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
> 
> 	* passes.c (skip_pass): Set epilogue_completed if skipping the
> 	pro_and_epilogue pass.
> 
> gcc/testsuite/ChangeLog:
> 
> 2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
> 
> 	* gcc.dg/rtl/aarch64/test-epilogue-set.c: New test.
> 
> 
> 
> ###############     Attachment also inlined for ease of reply    ###############
> 
> 
> diff --git a/gcc/passes.c b/gcc/passes.c
> index f838b586bff2bef6b075e7f7d59837bb3da00683..1851759349ced0f043cb3f5cb5e685ae4e05a95e 100644
> --- a/gcc/passes.c
> +++ b/gcc/passes.c
> @@ -2388,6 +2388,11 @@ skip_pass (opt_pass *pass)
>    if (strcmp (pass->name, "reload") == 0)
>      reload_completed = 1;
>  
> +  /* Similar for pass "pro_and_epilogue" and the "epilogue_completed" global
> +     variable.  */
> +  if (strcmp (pass->name, "pro_and_epilogue") == 0)
> +    epilogue_completed = 1;
> +
>    /* The INSN_ADDRESSES vec is normally set up by
>       shorten_branches; set it up for the benefit of passes that
>       run after this.  */
> diff --git a/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c b/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c
> new file mode 100644
> index 0000000000000000000000000000000000000000..e0b893c066771493c0b71bf70efa9e454f5c8131
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c
> @@ -0,0 +1,25 @@
> +/* { dg-do compile { target aarch64-*-* } } */
> +
> +/*
> +   Should compile rather than ICE.
> +   Compilation requires setting the "epilogue_completed" variable.
> + */
> +int __RTL (startwith ("cprop_hardreg"))
> +f ()
> +{
> +(function "f"
> +  (insn-chain
> +    (block 2
> +      (edge-from entry (flags "FALLTHRU"))
> +      (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK)
> +      (cinsn 100 (set (reg:DI x0)
> +		  (plus:DI
> +		   (reg:DI x1)
> +		   (const_int 16777213))))
> +      ;; Extra insn, to avoid all of the above from being deleted by DCE
> +      (cinsn 10 (use (reg/i:DI x0)))
> +      (edge-to exit (flags "FALLTHRU"))
> +    ) ;; block 2
> +  ) ;; insn-chain
> +) ;; function
> +}
> 
>

Patch
diff mbox series

diff --git a/gcc/passes.c b/gcc/passes.c
index f838b586bff2bef6b075e7f7d59837bb3da00683..1851759349ced0f043cb3f5cb5e685ae4e05a95e 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -2388,6 +2388,11 @@  skip_pass (opt_pass *pass)
   if (strcmp (pass->name, "reload") == 0)
     reload_completed = 1;
 
+  /* Similar for pass "pro_and_epilogue" and the "epilogue_completed" global
+     variable.  */
+  if (strcmp (pass->name, "pro_and_epilogue") == 0)
+    epilogue_completed = 1;
+
   /* The INSN_ADDRESSES vec is normally set up by
      shorten_branches; set it up for the benefit of passes that
      run after this.  */
diff --git a/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c b/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c
new file mode 100644
index 0000000000000000000000000000000000000000..e0b893c066771493c0b71bf70efa9e454f5c8131
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c
@@ -0,0 +1,25 @@ 
+/* { dg-do compile { target aarch64-*-* } } */
+
+/*
+   Should compile rather than ICE.
+   Compilation requires setting the "epilogue_completed" variable.
+ */
+int __RTL (startwith ("cprop_hardreg"))
+f ()
+{
+(function "f"
+  (insn-chain
+    (block 2
+      (edge-from entry (flags "FALLTHRU"))
+      (cnote 6 [bb 2] NOTE_INSN_BASIC_BLOCK)
+      (cinsn 100 (set (reg:DI x0)
+		  (plus:DI
+		   (reg:DI x1)
+		   (const_int 16777213))))
+      ;; Extra insn, to avoid all of the above from being deleted by DCE
+      (cinsn 10 (use (reg/i:DI x0)))
+      (edge-to exit (flags "FALLTHRU"))
+    ) ;; block 2
+  ) ;; insn-chain
+) ;; function
+}