diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2003-01-20 06:42:58 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2003-01-20 06:42:58 +0000 |
commit | d99c740f5832aa30a8250cbc236838f507c1767f (patch) | |
tree | 994e603809a734f6410e7b55b59c41d430eb4b01 /gcc | |
parent | 3fdd055a2b38027829a3f5c22678c962d80147d4 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/h8300/h8300.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20030120-1.c | 50 |
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); +} |