public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-10661] loop-invariant: Fix -fcompare-debug failure [PR103837]
@ 2022-05-10 8:22 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-05-10 8:22 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:aa998156c69fcb70ed637f34fd86e47020254ce5
commit r10-10661-gaa998156c69fcb70ed637f34fd86e47020254ce5
Author: Jakub Jelinek <jakub@redhat.com>
Date: Tue Dec 28 17:40:17 2021 +0100
loop-invariant: Fix -fcompare-debug failure [PR103837]
In the following testcase we have a -fcompare-debug failure, because
can_move_invariant_reg doesn't ignore DEBUG_INSNs in its decisions.
In the testcase we have due to uninitialized variable:
loop_header
debug_insn using pseudo84
pseudo84 = invariant
insn using pseudo84
end loop
and with -g decide not to move the pseudo84 = invariant before the
loop header; in this case not resetting the debug insns might be fine.
But, we could have also:
pseudo84 = whatever
loop_header
debug_insn using pseudo84
pseudo84 = invariant
insn using pseudo84
end loop
and in that case not resetting the debug insns would result in wrong-debug.
And, we don't really have generally a good substitution on what pseudo84
contains, it could inherit various values from different paths.
So, the following patch ignores DEBUG_INSNs in the decisions, and if there
are any that previously prevented the optimization, resets them before
return true.
2021-12-28 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/103837
* loop-invariant.c (can_move_invariant_reg): Ignore DEBUG_INSNs in
the decisions whether to return false or continue and right before
returning true reset those debug insns that previously caused
returning false.
* gcc.dg/pr103837.c: New test.
(cherry picked from commit 3c5fd3616f73fbcd241cc3a5e09275c2b0c49bd4)
Diff:
---
gcc/loop-invariant.c | 21 +++++++++++++++++----
gcc/testsuite/gcc.dg/pr103837.c | 19 +++++++++++++++++++
2 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c
index 37ae6549e56..3a9fcfabce8 100644
--- a/gcc/loop-invariant.c
+++ b/gcc/loop-invariant.c
@@ -1692,6 +1692,7 @@ can_move_invariant_reg (class loop *loop, struct invariant *inv, rtx reg)
unsigned int dest_regno, defs_in_loop_count = 0;
rtx_insn *insn = inv->insn;
basic_block bb = BLOCK_FOR_INSN (inv->insn);
+ auto_vec <rtx_insn *, 16> debug_insns_to_reset;
/* We ignore hard register and memory access for cost and complexity reasons.
Hard register are few at this stage and expensive to consider as they
@@ -1726,10 +1727,13 @@ can_move_invariant_reg (class loop *loop, struct invariant *inv, rtx reg)
continue;
/* Don't move if a use is not dominated by def in insn. */
- if (use_bb == bb && DF_INSN_LUID (insn) >= DF_INSN_LUID (use_insn))
- return false;
- if (!dominated_by_p (CDI_DOMINATORS, use_bb, bb))
- return false;
+ if ((use_bb == bb && DF_INSN_LUID (insn) >= DF_INSN_LUID (use_insn))
+ || !dominated_by_p (CDI_DOMINATORS, use_bb, bb))
+ {
+ if (!DEBUG_INSN_P (use_insn))
+ return false;
+ debug_insns_to_reset.safe_push (use_insn);
+ }
}
/* Check for other defs. Any other def in the loop might reach a use
@@ -1752,6 +1756,15 @@ can_move_invariant_reg (class loop *loop, struct invariant *inv, rtx reg)
return false;
}
+ /* Reset debug uses if a use is not dominated by def in insn. */
+ rtx_insn *use_insn;
+ unsigned i;
+ FOR_EACH_VEC_ELT (debug_insns_to_reset, i, use_insn)
+ {
+ INSN_VAR_LOCATION_LOC (use_insn) = gen_rtx_UNKNOWN_VAR_LOC ();
+ df_insn_rescan (use_insn);
+ }
+
return true;
}
diff --git a/gcc/testsuite/gcc.dg/pr103837.c b/gcc/testsuite/gcc.dg/pr103837.c
new file mode 100644
index 00000000000..43593d52b6c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr103837.c
@@ -0,0 +1,19 @@
+/* PR rtl-optimization/103837 */
+/* { dg-do compile } */
+/* { dg-options "-Og -fcompare-debug -fmove-loop-invariants -fnon-call-exceptions -fexceptions -fdelete-dead-exceptions -fno-tree-dce -w" } */
+
+unsigned long int
+foo (int x)
+{
+ double a;
+ int b;
+ unsigned long int ret = a;
+
+ for (;;)
+ {
+ b = !!((int) a);
+ a = x;
+ }
+
+ return ret;
+}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-05-10 8:22 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-10 8:22 [gcc r10-10661] loop-invariant: Fix -fcompare-debug failure [PR103837] Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).