diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-06-29 09:24:34 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-06-29 09:24:34 +0000 |
commit | 5dfebe0a555fccfc682699b6e6a0fa8e4d5f4a2f (patch) | |
tree | a099fe4257b48370bc3e7cbd10d363d74ea4eb12 /gcc/combine.c | |
parent | 4f036d9b3f06a7c05308cd5fedb6724c3de120f1 (diff) | |
download | gcc-5dfebe0a555fccfc682699b6e6a0fa8e4d5f4a2f.zip gcc-5dfebe0a555fccfc682699b6e6a0fa8e4d5f4a2f.tar.gz gcc-5dfebe0a555fccfc682699b6e6a0fa8e4d5f4a2f.tar.bz2 |
re PR rtl-optimization/44659 (Combiner fails to match QI cmp patterns with upper 8bit register)
PR rtl-optimization/44659
* combine.c (make_compound_operation) <SUBREG>: Do not return the
result of force_to_mode if it partially re-expanded the compound.
From-SVN: r161523
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 1bee2c7..d3305cb 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7277,22 +7277,21 @@ make_compound_operation (rtx x, enum rtx_code in_code) /* Call ourselves recursively on the inner expression. If we are narrowing the object and it has a different RTL code from what it originally did, do this SUBREG as a force_to_mode. */ - - tem = make_compound_operation (SUBREG_REG (x), in_code); - { - rtx simplified = simplify_subreg (mode, tem, GET_MODE (SUBREG_REG (x)), - SUBREG_BYTE (x)); + rtx inner = SUBREG_REG (x), simplified; + + tem = make_compound_operation (inner, in_code); + simplified + = simplify_subreg (mode, tem, GET_MODE (inner), SUBREG_BYTE (x)); if (simplified) tem = simplified; - if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x)) - && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) + if (GET_CODE (tem) != GET_CODE (inner) + && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner)) && subreg_lowpart_p (x)) { - rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0, - 0); + rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0, 0); /* If we have something other than a SUBREG, we might have done an expansion, so rerun ourselves. */ @@ -7300,9 +7299,16 @@ make_compound_operation (rtx x, enum rtx_code in_code) newer = make_compound_operation (newer, in_code); /* force_to_mode can expand compounds. If it just re-expanded the - compound use gen_lowpart instead to convert to the desired - mode. */ - if (rtx_equal_p (newer, x)) + compound, use gen_lowpart to convert to the desired mode. */ + if (rtx_equal_p (newer, x) + /* Likewise if it re-expanded the compound only partially. + This happens for SUBREG of ZERO_EXTRACT if they extract + the same number of bits. */ + || (GET_CODE (newer) == SUBREG + && (GET_CODE (SUBREG_REG (newer)) == LSHIFTRT + || GET_CODE (SUBREG_REG (newer)) == ASHIFTRT) + && GET_CODE (inner) == AND + && rtx_equal_p (SUBREG_REG (newer), XEXP (inner, 0)))) return gen_lowpart (GET_MODE (x), tem); return newer; |