aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-01-26 12:48:05 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-01-26 12:48:05 +0100
commit45399fdc7c120342bb1b84595e0d54deb58c7235 (patch)
tree26b1069c17b0e7061e660af8f998563a8d4a12e3
parent79fbdeb87e6e91a8179465ea56007e493c7ca751 (diff)
downloadgcc-45399fdc7c120342bb1b84595e0d54deb58c7235.zip
gcc-45399fdc7c120342bb1b84595e0d54deb58c7235.tar.gz
gcc-45399fdc7c120342bb1b84595e0d54deb58c7235.tar.bz2
re PR rtl-optimization/83985 (Compile time hog for 32-bit BE powerpc targets)
PR rtl-optimization/83985 * dce.c (deletable_insn_p): Return false for separate shrink wrapping REG_CFA_RESTORE insns. (delete_unmarked_insns): Don't ignore separate shrink wrapping REG_CFA_RESTORE insns here. * gcc.dg/pr83985.c: New test. From-SVN: r257087
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dce.c15
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/pr83985.c25
4 files changed, 40 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 32fb7ba..764368a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2018-01-26 Jakub Jelinek <jakub@redhat.com>
+ PR rtl-optimization/83985
+ * dce.c (deletable_insn_p): Return false for separate shrink wrapping
+ REG_CFA_RESTORE insns.
+ (delete_unmarked_insns): Don't ignore separate shrink wrapping
+ REG_CFA_RESTORE insns here.
+
PR c/83989
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Don't
use SSA_NAME_VAR as base for SSA_NAMEs with non-NULL SSA_NAME_VAR.
diff --git a/gcc/dce.c b/gcc/dce.c
index 590b687..e00d029 100644
--- a/gcc/dce.c
+++ b/gcc/dce.c
@@ -131,6 +131,12 @@ deletable_insn_p (rtx_insn *insn, bool fast, bitmap arg_stores)
&& REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
return false;
+ /* Callee-save restores are needed. */
+ if (RTX_FRAME_RELATED_P (insn)
+ && crtl->shrink_wrapped_separate
+ && find_reg_note (insn, REG_CFA_RESTORE, NULL))
+ return false;
+
body = PATTERN (insn);
switch (GET_CODE (body))
{
@@ -592,15 +598,6 @@ delete_unmarked_insns (void)
if (!dbg_cnt (dce))
continue;
- if (crtl->shrink_wrapped_separate
- && find_reg_note (insn, REG_CFA_RESTORE, NULL))
- {
- if (dump_file)
- fprintf (dump_file, "DCE: NOT deleting insn %d, it's a "
- "callee-save restore\n", INSN_UID (insn));
- continue;
- }
-
if (dump_file)
fprintf (dump_file, "DCE: Deleting insn %d\n", INSN_UID (insn));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c484d5b..5fa94c8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2018-01-26 Jakub Jelinek <jakub@redhat.com>
+ PR rtl-optimization/83985
+ * gcc.dg/pr83985.c: New test.
+
PR c/83989
* c-c++-common/Wrestrict-3.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr83985.c b/gcc/testsuite/gcc.dg/pr83985.c
new file mode 100644
index 0000000..51cfc49
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr83985.c
@@ -0,0 +1,25 @@
+/* PR rtl-optimization/83985 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-mcpu=e300c3 -mtune=e300c3" { target { powerpc*-*-* && ilp32 } } } */
+
+long long int v;
+
+void
+foo (int x)
+{
+ if (x == 0)
+ return;
+
+ while (v < 2)
+ {
+ signed char *a;
+ v /= x;
+ a = v == 0 ? (signed char *) &x : (signed char *) &v;
+ ++*a;
+ ++v;
+ }
+
+ while (1)
+ ;
+}