aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2002-04-10 03:50:39 +0000
committerAlan Modra <amodra@gcc.gnu.org>2002-04-10 13:20:39 +0930
commita6a063b81ce323e49eb23bd87d7147c5cb09814e (patch)
tree8f57737d03a2fc651bab26e059ff589511d75dfa /gcc/rtlanal.c
parent7b2e1077614049c9899772aa14edab91e80e7ec5 (diff)
downloadgcc-a6a063b81ce323e49eb23bd87d7147c5cb09814e.zip
gcc-a6a063b81ce323e49eb23bd87d7147c5cb09814e.tar.gz
gcc-a6a063b81ce323e49eb23bd87d7147c5cb09814e.tar.bz2
re PR rtl-optimization/6233 (simple loop miscompilation)
PR optimization/6233 * rtlanal.c (pure_call_p): New function. * rtl.h (pure_call_p): Declare. * loop.c (prescan_loop): Use it to set has_nonconst_call. * gcse.c (store_killed_in_insn): Use pure_call_p here too. From-SVN: r52110
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r--gcc/rtlanal.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 9348fd0..07cb6d8 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -2011,6 +2011,31 @@ find_regno_fusage (insn, code, regno)
return 0;
}
+
+/* Return true if INSN is a call to a pure function. */
+
+int
+pure_call_p (insn)
+ rtx insn;
+{
+ rtx link;
+
+ if (GET_CODE (insn) != CALL_INSN || ! CONST_OR_PURE_CALL_P (insn))
+ return 0;
+
+ /* Look for the note that differentiates const and pure functions. */
+ for (link = CALL_INSN_FUNCTION_USAGE (insn); link; link = XEXP (link, 1))
+ {
+ rtx u, m;
+
+ if (GET_CODE (u = XEXP (link, 0)) == USE
+ && GET_CODE (m = XEXP (u, 0)) == MEM && GET_MODE (m) == BLKmode
+ && GET_CODE (XEXP (m, 0)) == SCRATCH)
+ return 1;
+ }
+
+ return 0;
+}
/* Remove register note NOTE from the REG_NOTES of INSN. */