70 lines
1.7 KiB
Diff
70 lines
1.7 KiB
Diff
|
|
This backport contains 1 patch from gcc main stream tree.
|
||
|
|
The commit id of these patchs list as following in the order of time.
|
||
|
|
|
||
|
|
0001-optabs-Don-t-use-scalar-conversions-for-vectors-PR93.patch
|
||
|
|
b6268016bf46dd63227dcbb73d13c30a3b4b9d2a
|
||
|
|
|
||
|
|
diff --git a/gcc/optabs-tree.c b/gcc/optabs-tree.c
|
||
|
|
index 3d829c27826..badd30bfda8 100644
|
||
|
|
--- a/gcc/optabs-tree.c
|
||
|
|
+++ b/gcc/optabs-tree.c
|
||
|
|
@@ -284,9 +284,14 @@ supportable_convert_operation (enum tree_code code,
|
||
|
|
machine_mode m1,m2;
|
||
|
|
bool truncp;
|
||
|
|
|
||
|
|
+ gcc_assert (VECTOR_TYPE_P (vectype_out) && VECTOR_TYPE_P (vectype_in));
|
||
|
|
+
|
||
|
|
m1 = TYPE_MODE (vectype_out);
|
||
|
|
m2 = TYPE_MODE (vectype_in);
|
||
|
|
|
||
|
|
+ if (!VECTOR_MODE_P (m1) || !VECTOR_MODE_P (m2))
|
||
|
|
+ return false;
|
||
|
|
+
|
||
|
|
/* First check if we can done conversion directly. */
|
||
|
|
if ((code == FIX_TRUNC_EXPR
|
||
|
|
&& can_fix_p (m1,m2,TYPE_UNSIGNED (vectype_out), &truncp)
|
||
|
|
diff --git a/gcc/testsuite/gcc.dg/vect/pr93843-1.c b/gcc/testsuite/gcc.dg/vect/pr93843-1.c
|
||
|
|
new file mode 100644
|
||
|
|
index 00000000000..23a79ca4c96
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/gcc/testsuite/gcc.dg/vect/pr93843-1.c
|
||
|
|
@@ -0,0 +1,21 @@
|
||
|
|
+char a;
|
||
|
|
+struct S { short b, c; } d;
|
||
|
|
+
|
||
|
|
+__attribute__((noipa)) void
|
||
|
|
+foo (int x)
|
||
|
|
+{
|
||
|
|
+ if (x != 4)
|
||
|
|
+ __builtin_abort ();
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+int
|
||
|
|
+main ()
|
||
|
|
+{
|
||
|
|
+ short *g = &d.c, *h = &d.b;
|
||
|
|
+ char e = 4 - a;
|
||
|
|
+ int f;
|
||
|
|
+ *h = *g = e;
|
||
|
|
+ for (f = 0; f < 2; f++)
|
||
|
|
+ foo (d.c);
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
diff --git a/gcc/testsuite/gcc.dg/vect/pr93843-2.c b/gcc/testsuite/gcc.dg/vect/pr93843-2.c
|
||
|
|
new file mode 100644
|
||
|
|
index 00000000000..5fae3e5be17
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/gcc/testsuite/gcc.dg/vect/pr93843-2.c
|
||
|
|
@@ -0,0 +1,11 @@
|
||
|
|
+char in[2] = {2, 2};
|
||
|
|
+short out[2] = {};
|
||
|
|
+
|
||
|
|
+int
|
||
|
|
+main()
|
||
|
|
+{
|
||
|
|
+ for (int i = 0; i < 2; ++i)
|
||
|
|
+ out[i] = in[i];
|
||
|
|
+ asm("":::"memory");
|
||
|
|
+ if (out[0] != 2) __builtin_abort();
|
||
|
|
+}
|