diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr108064.c | 28 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.cc | 10 |
2 files changed, 33 insertions, 5 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr108064.c b/gcc/testsuite/gcc.c-torture/execute/pr108064.c new file mode 100644 index 0000000..a7170bc --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr108064.c @@ -0,0 +1,28 @@ +/* PR tree-optimization/108064 */ + +static inline short +foo (short value) +{ + return ((value >> 8) & 0xff) | ((value & 0xff) << 8); +} + +__attribute__((noipa)) +void +bar (short *d, const short *s) +{ + for (unsigned long i = 0; i < 4; i++) + d[i] = foo (s[i]); +} + +int +main () +{ + short a[4] __attribute__((aligned (16))) = { 0xff, 0, 0, 0 }; + short b[4] __attribute__((aligned (16))); + short c[4] __attribute__((aligned (16))); + + bar (b, a); + bar (c, b); + if (a[0] != c[0]) + __builtin_abort (); +} diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc index d9fdb24..32f95a7 100644 --- a/gcc/tree-vect-patterns.cc +++ b/gcc/tree-vect-patterns.cc @@ -3113,7 +3113,7 @@ vect_recog_rotate_pattern (vec_info *vinfo, { def = vect_recog_temp_ssa_var (utype, NULL); def_stmt = gimple_build_assign (def, NOP_EXPR, oprnd0); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); oprnd0 = def; } @@ -3137,7 +3137,7 @@ vect_recog_rotate_pattern (vec_info *vinfo, { def = vect_recog_temp_ssa_var (utype, NULL); def_stmt = gimple_build_assign (def, NOP_EXPR, oprnd1); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); } stype = TREE_TYPE (def); @@ -3185,13 +3185,13 @@ vect_recog_rotate_pattern (vec_info *vinfo, def_stmt = gimple_build_assign (var1, rhs_code == LROTATE_EXPR ? LSHIFT_EXPR : RSHIFT_EXPR, oprnd0, def); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); var2 = vect_recog_temp_ssa_var (utype, NULL); def_stmt = gimple_build_assign (var2, rhs_code == LROTATE_EXPR ? RSHIFT_EXPR : LSHIFT_EXPR, oprnd0, def2); - append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, def_stmt, uvectype); /* Pattern detected. */ vect_pattern_detected ("vect_recog_rotate_pattern", last_stmt); @@ -3202,7 +3202,7 @@ vect_recog_rotate_pattern (vec_info *vinfo, if (!useless_type_conversion_p (type, utype)) { - append_pattern_def_seq (vinfo, stmt_vinfo, pattern_stmt); + append_pattern_def_seq (vinfo, stmt_vinfo, pattern_stmt, uvectype); tree result = vect_recog_temp_ssa_var (type, NULL); pattern_stmt = gimple_build_assign (result, NOP_EXPR, var); } |