diff options
| author | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-06-06 12:12:32 +0000 |
|---|---|---|
| committer | uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-06-06 12:12:32 +0000 |
| commit | bb6c9541e9d3949965c0c89074754a14a8823983 (patch) | |
| tree | de9849634b1b7fa1d9a2c6099d590044f0aa8c3a /gcc/tree-vectorizer.c | |
| parent | b852d3a09892a4681d07a34043d674621f2080f0 (diff) | |
| download | ppe42-gcc-bb6c9541e9d3949965c0c89074754a14a8823983.tar.gz ppe42-gcc-bb6c9541e9d3949965c0c89074754a14a8823983.zip | |
PR tree-optimization/32216
* tree-vectorizer.c (supportable_widening_operation): Determine
signedness of FIX_TRUNC_EXPR from output operand.
(supportable_narrowing_operation): Ditto.
* tree-vect-generic.c (expand_vector_operations_1): Determine
signedness of VEC_UNPACK_FLOAT_HI_EXPR and VEC_UNPACK_FLOAT_LO_EXPR
from input operand.
testsuite/ChangeLog:
PR tree-optimization/32216
* gcc.dg/vect/pr32216.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125482 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vectorizer.c')
| -rw-r--r-- | gcc/tree-vectorizer.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index be2d6b3c7f7..8dba4d03cf9 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -1851,10 +1851,17 @@ supportable_widening_operation (enum tree_code code, tree stmt, tree vectype, gcc_unreachable (); } - *code1 = c1; - *code2 = c2; - optab1 = optab_for_tree_code (c1, vectype); - optab2 = optab_for_tree_code (c2, vectype); + if (code == FIX_TRUNC_EXPR) + { + /* The signedness is determined from output operand. */ + optab1 = optab_for_tree_code (c1, type); + optab2 = optab_for_tree_code (c2, type); + } + else + { + optab1 = optab_for_tree_code (c1, vectype); + optab2 = optab_for_tree_code (c2, vectype); + } if (!optab1 || !optab2) return false; @@ -1867,6 +1874,8 @@ supportable_widening_operation (enum tree_code code, tree stmt, tree vectype, || insn_data[icode2].operand[0].mode != TYPE_MODE (wide_vectype)) return false; + *code1 = c1; + *code2 = c2; return true; } @@ -1918,8 +1927,11 @@ supportable_narrowing_operation (enum tree_code code, gcc_unreachable (); } - *code1 = c1; - optab1 = optab_for_tree_code (c1, vectype); + if (code == FIX_TRUNC_EXPR) + /* The signedness is determined from output operand. */ + optab1 = optab_for_tree_code (c1, type); + else + optab1 = optab_for_tree_code (c1, vectype); if (!optab1) return false; @@ -1929,6 +1941,7 @@ supportable_narrowing_operation (enum tree_code code, || insn_data[icode1].operand[0].mode != TYPE_MODE (narrow_vectype)) return false; + *code1 = c1; return true; } |

