aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-07-06 21:50:50 +0000
committerJeff Law <law@gcc.gnu.org>1998-07-06 15:50:50 -0600
commited79bb3d427c5fa3fa39240a965f47de2463c37c (patch)
tree62fb7190f182ab40d6bda74df6f131aa8dd17194 /gcc
parentfcc60894b89947e0fb4a0833d6c99a7c20cf6e63 (diff)
downloadgcc-ed79bb3d427c5fa3fa39240a965f47de2463c37c.zip
gcc-ed79bb3d427c5fa3fa39240a965f47de2463c37c.tar.gz
gcc-ed79bb3d427c5fa3fa39240a965f47de2463c37c.tar.bz2
gcse.c (hash_scan_insn): New argument IN_LIBCALL_BLOCK.
* gcse.c (hash_scan_insn): New argument IN_LIBCALL_BLOCK. Changed caller. From-SVN: r20967
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gcse.c21
2 files changed, 20 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 275b162..9f0c949 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Mon Jul 6 22:47:55 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
+
+ * gcse.c (hash_scan_insn): New argument IN_LIBCALL_BLOCK. Changed
+ caller.
+
Mon Jul 6 22:21:56 1998 Kamil Iskra <iskra@student.uci.agh.edu.pl>
* m68k.c (output_scc_di): Use cmpw #0 instead of tstl when
diff --git a/gcc/gcse.c b/gcc/gcse.c
index c40f687..c424a33 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -550,7 +550,7 @@ static void record_one_set PROTO ((int, rtx));
static void record_set_info PROTO ((rtx, rtx));
static void compute_sets PROTO ((rtx));
-static void hash_scan_insn PROTO ((rtx, int));
+static void hash_scan_insn PROTO ((rtx, int, int));
static void hash_scan_set PROTO ((rtx, rtx, int));
static void hash_scan_clobber PROTO ((rtx, rtx));
static void hash_scan_call PROTO ((rtx, rtx));
@@ -1849,10 +1849,12 @@ hash_scan_call (x, insn)
are also in the PARALLEL. Later.
If SET_P is non-zero, this is for the assignment hash table,
- otherwise it is for the expression hash table. */
+ otherwise it is for the expression hash table.
+ If IN_LIBCALL_BLOCK nonzero, we are in a libcall block, and should
+ not record any expressions. */
static void
-hash_scan_insn (insn, set_p)
+hash_scan_insn (insn, set_p, in_libcall_block)
rtx insn;
int set_p;
{
@@ -1861,7 +1863,7 @@ hash_scan_insn (insn, set_p)
/* Pick out the sets of INSN and for other forms of instructions record
what's been modified. */
- if (GET_CODE (pat) == SET)
+ if (GET_CODE (pat) == SET && ! in_libcall_block)
hash_scan_set (pat, insn, set_p);
else if (GET_CODE (pat) == PARALLEL)
{
@@ -2037,6 +2039,7 @@ compute_hash_table (f, set_p)
{
rtx insn;
int regno;
+ int in_libcall_block;
/* First pass over the instructions records information used to
determine when registers and memory are first and last set.
@@ -2080,12 +2083,18 @@ compute_hash_table (f, set_p)
/* The next pass builds the hash table. */
- for (insn = basic_block_head[bb];
+ for (insn = basic_block_head[bb], in_libcall_block = 0;
insn && insn != NEXT_INSN (basic_block_end[bb]);
insn = NEXT_INSN (insn))
{
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
- hash_scan_insn (insn, set_p);
+ {
+ if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
+ in_libcall_block = 1;
+ else if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
+ in_libcall_block = 0;
+ hash_scan_insn (insn, set_p, in_libcall_block);
+ }
}
}