This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/28115] New: possible bug in recog_memoized usage in rs6000.c??
- From: "dkwan at transmeta dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 20 Jun 2006 23:44:05 -0000
- Subject: [Bug target/28115] New: possible bug in recog_memoized usage in rs6000.c??
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
This problem is found by code inspection. The comment of the generated file
insn-recog.c says:
`recog' contains a decision tree that recognizes whether the rtx
X0 is a valid instruction.
recog returns -1 if the rtx is not valid. If the rtx is valid, recog
returns a nonnegative number which is the insn code number for the
pattern that matched. This is the same as the order in the machine
description of the entry that matched. This number can be used as an
index into `insn_data' and other tables.
recog_memoized() is just a wrapper around recog() to cache results.
In recog.h:
/* Try recognizing the instruction INSN,
and return the code number that results.
Remember the code so that repeated calls do not
need to spend the time for actual rerecognition.
This function is the normal interface to instruction recognition.
The automatically-generated function `recog' is normally called
through this one. (The only exception is in combine.c.) */
static inline int
recog_memoized (rtx insn)
{
if (INSN_CODE (insn) < 0)
INSN_CODE (insn) = recog (PATTERN (insn), insn, 0);
return INSN_CODE (insn);
}
Yet in rs6000.c, there is code in rs6000_adjust_cost:
line 16312:
if (! recog_memoized (insn))
return 0;
line: 16355
&& recog_memoized (dep_insn)
&& (INSN_CODE (dep_insn) >= 0)
These look as if it is assumed that recog_memoized return 0 for invalid
instructions but 0 is a valid result code. The checks should be done against
negative return values instead.
--
Summary: possible bug in recog_memoized usage in rs6000.c??
Product: gcc
Version: 4.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: dkwan at transmeta dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28115