aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2003-01-20 06:42:58 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2003-01-20 06:42:58 +0000
commitd99c740f5832aa30a8250cbc236838f507c1767f (patch)
tree994e603809a734f6410e7b55b59c41d430eb4b01 /gcc
parent3fdd055a2b38027829a3f5c22678c962d80147d4 (diff)
downloadgcc-d99c740f5832aa30a8250cbc236838f507c1767f.zip
gcc-d99c740f5832aa30a8250cbc236838f507c1767f.tar.gz
gcc-d99c740f5832aa30a8250cbc236838f507c1767f.tar.bz2
h8300.c (notice_update_cc): Don't assume that recog_data.operands[0] is always associated with cc0.
* config/h8300/h8300.c (notice_update_cc): Don't assume that recog_data.operands[0] is always associated with cc0. * gcc.c-torture/execute/20030120-1.c: New. From-SVN: r61498
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/h8300/h8300.c14
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20030120-1.c50
4 files changed, 69 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6007915..5e795ce 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-01-20 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300.c (notice_update_cc): Don't assume that
+ recog_data.operands[0] is always associated with cc0.
+
2003-01-19 David Edelsohn <edelsohn@gnu.org>
* collect2.c (ldgetname): Expand declaration to prototype.
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index c98f6e1..faa9248 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -1710,6 +1710,8 @@ notice_update_cc (body, insn)
rtx body;
rtx insn;
{
+ rtx set;
+
switch (get_attr_cc (insn))
{
case CC_NONE:
@@ -1732,7 +1734,10 @@ notice_update_cc (body, insn)
that's ok because alter_cond will change tests to use EQ/NE. */
CC_STATUS_INIT;
cc_status.flags |= CC_OVERFLOW_UNUSABLE | CC_NO_CARRY;
- cc_status.value1 = recog_data.operand[0];
+ set = single_set (insn);
+ cc_status.value1 = SET_SRC (set);
+ if (SET_DEST (set) != cc0_rtx)
+ cc_status.value2 = SET_DEST (set);
break;
case CC_SET_ZNV:
@@ -1741,9 +1746,10 @@ notice_update_cc (body, insn)
alter_cond will change tests to use EQ/NE. */
CC_STATUS_INIT;
cc_status.flags |= CC_NO_CARRY;
- cc_status.value1 = recog_data.operand[0];
- if (GET_CODE (body) == SET && REG_P (SET_SRC (body)))
- cc_status.value2 = SET_SRC (body);
+ set = single_set (insn);
+ cc_status.value1 = SET_SRC (set);
+ if (SET_DEST (set) != cc0_rtx)
+ cc_status.value2 = SET_DEST (set);
break;
case CC_COMPARE:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 71f07f7..79e76c0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-01-20 Kazu Hirata <kazu@cs.umass.edu>
+
+ * gcc.c-torture/execute/20030120-1.c: New.
+
2003-01-19 Paolo Carlini <pcarlini@unitus.it>
* g++.old-deja/g++.pt/typename13.C: Remove XFAIL.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20030120-1.c b/gcc/testsuite/gcc.c-torture/execute/20030120-1.c
new file mode 100644
index 0000000..0ac0ecf
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20030120-1.c
@@ -0,0 +1,50 @@
+/* On H8/300 port, NOTICE_UPDATE_CC had a bug that causes the final
+ pass to remove test insns that should be kept. */
+
+unsigned short
+test1 (unsigned short w)
+{
+ if ((w & 0xff00) == 0)
+ {
+ if (w == 0)
+ w = 2;
+ }
+ return w;
+}
+
+unsigned long
+test2 (unsigned long w)
+{
+ if ((w & 0xffff0000) == 0)
+ {
+ if (w == 0)
+ w = 2;
+ }
+ return w;
+}
+
+int
+test3 (unsigned short a)
+{
+ if (a & 1)
+ return 1;
+ else if (a)
+ return 1;
+ else
+ return 0;
+}
+
+int
+main ()
+{
+ if (test1 (1) != 1)
+ abort ();
+
+ if (test2 (1) != 1)
+ abort ();
+
+ if (test3 (2) != 1)
+ abort ();
+
+ exit (0);
+}