diff options
author | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-07 12:39:37 +0000 |
---|---|---|
committer | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-07 12:39:37 +0000 |
commit | 235155dac55fc35b2246f31587a3ae6114201542 (patch) | |
tree | ddb1a455292b8f52dd722c3a8f9f3746a1f9c3d9 /gcc/optabs.c | |
parent | 2040a7e451b5111e9912afdb422604e782d86bef (diff) | |
download | gcc-235155dac55fc35b2246f31587a3ae6114201542.tar.gz |
2009-04-07 Paolo Bonzini <bonzini@gnu.org>
* optabs.c (can_compare_p): Test the predicate of a
cbranch and cstore pattern.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145667 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index f7e44db48c2..7057d9ffa31 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -3980,8 +3980,12 @@ int can_compare_p (enum rtx_code code, enum machine_mode mode, enum can_compare_purpose purpose) { + rtx test; + test = gen_rtx_fmt_ee (code, mode, const0_rtx, const0_rtx); do { + int icode; + if (optab_handler (cmp_optab, mode)->insn_code != CODE_FOR_nothing) { if (purpose == ccp_jump) @@ -3993,15 +3997,19 @@ can_compare_p (enum rtx_code code, enum machine_mode mode, return 1; } if (purpose == ccp_jump - && optab_handler (cbranch_optab, mode)->insn_code != CODE_FOR_nothing) - return 1; + && (icode = optab_handler (cbranch_optab, mode)->insn_code) != CODE_FOR_nothing + && insn_data[icode].operand[0].predicate (test, mode)) + return 1; + if (purpose == ccp_store_flag + && (icode = optab_handler (cstore_optab, mode)->insn_code) != CODE_FOR_nothing + && insn_data[icode].operand[1].predicate (test, mode)) + return 1; if (purpose == ccp_cmov && optab_handler (cmov_optab, mode)->insn_code != CODE_FOR_nothing) return 1; - if (purpose == ccp_store_flag - && optab_handler (cstore_optab, mode)->insn_code != CODE_FOR_nothing) - return 1; + mode = GET_MODE_WIDER_MODE (mode); + PUT_MODE (test, mode); } while (mode != VOIDmode); |