[mid-end][__RTL] Set global epilogue_completed in skip_pass
authorMatthew Malcomson <matthew.malcomson@arm.com>
Fri, 15 Nov 2019 12:10:56 +0000 (12:10 +0000)
committerMatthew Malcomson <matmal01@gcc.gnu.org>
Fri, 15 Nov 2019 12:10:56 +0000 (12:10 +0000)
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.

From-SVN: r278285

gcc/ChangeLog
gcc/passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/rtl/aarch64/test-epilogue-set.c [new file with mode: 0644]

index 8db3c4ad50d2addfff145670830ba3d0f0bacfe6..2f9325289a295648e4150ef09cd8561e6672ed23 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
+
+       * passes.c (skip_pass): Set epilogue_completed if skipping the
+       pro_and_epilogue pass.
+
 2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
 
        * passes.c (should_skip_pass_p): Always run "dfinish".
index b77356d164177589f95d4dd8ccbf4e24f635496e..331570ec844133953705035a50a29992f7b152ca 100644 (file)
@@ -2400,6 +2400,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.  */
index 2b630ef16aee6f9e735c980d2946cd8b3a82751a..11a446cd9bea8a4b60b5f57df04236193e5544c3 100644 (file)
@@ -1,3 +1,7 @@
+2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
+
+       * gcc.dg/rtl/aarch64/test-epilogue-set.c: New test.
+
 2019-11-15  Matthew Malcomson  <matthew.malcomson@arm.com>
 
        * gcc.dg/rtl/aarch64/missed-pass-error.c: New test.
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 (file)
index 0000000..e0b893c
--- /dev/null
@@ -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
+}