aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-02-10 22:44:40 +0100
committerJakub Jelinek <jakub@redhat.com>2020-02-10 22:44:40 +0100
commitf57aa9503ff170ff6c8549718bd736f6c8168bab (patch)
tree32c89edb90d99d0437a1214b3cf0db01f12bba28 /gcc
parent41a9e940c7014f117738a9a59b31833047a1083d (diff)
downloadgcc-f57aa9503ff170ff6c8549718bd736f6c8168bab.zip
gcc-f57aa9503ff170ff6c8549718bd736f6c8168bab.tar.gz
gcc-f57aa9503ff170ff6c8549718bd736f6c8168bab.tar.bz2
i386: Fix -mavx -mno-mavx2 ICE with VEC_COND_EXPR [PR93637]
As mentioned in the PR, for -mavx -mno-avx2 the backend does support vcondv4div4df and vcondv8siv8sf optabs (while generally 32-byte vectors aren't much supported in that case, it is performed using vandps/vandnps/vorps). The problem is that after the last generic vector lowering (where the VEC_COND_EXPR still compares two V4DF vectors and has two V4DI last operands and V4DI result and so is considered ok) fre4 folds the condition into constant, at which point the middle-end during expansion will try vcond_mask_optab and fall back to trying to expand it as the constant vector < 0 vcondv4div4di, but neither of them is supported for -mavx -mno-avx2 and thus we ICE. So, the options I see is either what the following patch does, also support vcond_mask_v4div4di and vcond_mask_v4siv4si already for TARGET_AVX, or require for vcondv4div4df and vcondv8siv8sf TARGET_AVX2 rather than current TARGET_AVX. 2020-02-10 Jakub Jelinek <jakub@redhat.com> PR target/93637 * config/i386/sse.md (VI_256_AVX2): New mode iterator. (vcond_mask_<mode><sseintvecmodelower>): Use it instead of VI_256. Change condition from TARGET_AVX2 to TARGET_AVX. * gcc.target/i386/avx-pr93637.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/sse.md16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/avx-pr93637.c17
4 files changed, 40 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3892d9a..9f44b6f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2020-02-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/93637
+ * config/i386/sse.md (VI_256_AVX2): New mode iterator.
+ (vcond_mask_<mode><sseintvecmodelower>): Use it instead of VI_256.
+ Change condition from TARGET_AVX2 to TARGET_AVX.
+
2020-02-10 Iain Sandoe <iain@sandoe.co.uk>
PR other/93641
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 8879a65..902ea31 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -3430,13 +3430,19 @@
(match_operand:<avx512fmaskmode> 3 "register_operand")))]
"TARGET_AVX512BW")
+;; As vcondv4div4df and vcondv8siv8sf are enabled already with TARGET_AVX,
+;; and their condition can be folded late into a constant, we need to
+;; support vcond_mask_v4div4di and vcond_mask_v8siv8si for TARGET_AVX.
+(define_mode_iterator VI_256_AVX2 [(V32QI "TARGET_AVX2") (V16HI "TARGET_AVX2")
+ V8SI V4DI])
+
(define_expand "vcond_mask_<mode><sseintvecmodelower>"
- [(set (match_operand:VI_256 0 "register_operand")
- (vec_merge:VI_256
- (match_operand:VI_256 1 "nonimmediate_operand")
- (match_operand:VI_256 2 "nonimm_or_0_operand")
+ [(set (match_operand:VI_256_AVX2 0 "register_operand")
+ (vec_merge:VI_256_AVX2
+ (match_operand:VI_256_AVX2 1 "nonimmediate_operand")
+ (match_operand:VI_256_AVX2 2 "nonimm_or_0_operand")
(match_operand:<sseintvecmode> 3 "register_operand")))]
- "TARGET_AVX2"
+ "TARGET_AVX"
{
ix86_expand_sse_movcc (operands[0], operands[3],
operands[1], operands[2]);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b3a875e..d6d0112 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-10 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/93637
+ * gcc.target/i386/avx-pr93637.c: New test.
+
2020-02-10 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93405
diff --git a/gcc/testsuite/gcc.target/i386/avx-pr93637.c b/gcc/testsuite/gcc.target/i386/avx-pr93637.c
new file mode 100644
index 0000000..9e7a0a7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx-pr93637.c
@@ -0,0 +1,17 @@
+/* PR target/93637 */
+/* { dg-do compile } */
+/* { dg-options "-mavx -mno-avx2 -O3 --param sccvn-max-alias-queries-per-access=3" } */
+
+double
+foo (void)
+{
+ int i;
+ double r = 7.0;
+ double a[] = { 0.0, 0.0, -0.0, 0.0, 0.0, -0.0, 1.0, 0.0, 0.0, -0.0, 1.0, 0.0, 1.0, 1.0 };
+
+ for (i = 0; i < sizeof (a) / sizeof (a[0]); ++i)
+ if (a[i] == 0.0)
+ r = a[i];
+
+ return r;
+}