aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr108064.c28
-rw-r--r--gcc/tree-vect-patterns.cc10
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);
}