diff options
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index ff10663..82d260d 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -8117,14 +8117,15 @@ apply_distributive_law (rtx x) break; case SUBREG: - /* Non-paradoxical SUBREGs distributes over all operations, provided - the inner modes and byte offsets are the same, this is an extraction - of a low-order part, we don't convert an fp operation to int or - vice versa, and we would not be converting a single-word - operation into a multi-word operation. The latter test is not - required, but it prevents generating unneeded multi-word operations. - Some of the previous tests are redundant given the latter test, but - are retained because they are required for correctness. + /* Non-paradoxical SUBREGs distributes over all operations, + provided the inner modes and byte offsets are the same, this + is an extraction of a low-order part, we don't convert an fp + operation to int or vice versa, this is not a vector mode, + and we would not be converting a single-word operation into a + multi-word operation. The latter test is not required, but + it prevents generating unneeded multi-word operations. Some + of the previous tests are redundant given the latter test, + but are retained because they are required for correctness. We produce the result slightly differently in this case. */ @@ -8135,6 +8136,7 @@ apply_distributive_law (rtx x) != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs)))) || (GET_MODE_SIZE (GET_MODE (lhs)) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs)))) + || VECTOR_MODE_P (GET_MODE (lhs)) || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD) return x; |