https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110817

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Hmm, we lower from

  v.0_1 = v;
  _2 = v.0_1 != { 0, 0 };
  c.1_8 = c;
  _4 = (unsigned int) c.1_8;
  _3 = {_4, _4};
  _10 = v.0_1 == _3;
  _9 = _2 | _10;
  _5 = VEC_COND_EXPR <_9, { 0, 0 }, { -1, -1 }>;
  _6 = VIEW_CONVERT_EXPR<long unsigned int>(_5);
  if (_6 != 0)

that's v != 0 | v == c, I don't think that's equal to the original expression.

Some match.pd pattern goes wrong here I think, possibly not honoring the
sign of vector bools.

goes wrong during forwprop1:

--- a-t2.c.034t.ccp1    2023-07-27 09:22:25.683940331 +0200
+++ a-t2.c.035t.forwprop1       2023-07-27 09:22:25.683940331 +0200
@@ -6,19 +6,14 @@
 Applying pattern match.pd:4716, gimple-match-2.cc:16058
 Applying pattern match.pd:4586, gimple-match-2.cc:9314
 Applying pattern match.pd:4586, gimple-match-2.cc:11869
+Applying pattern match.pd:5327, gimple-match-8.cc:3364
+Matching expression match.pd:1979, gimple-match-7.cc:91
+Applying pattern match.pd:4683, gimple-match-2.cc:15638
+Matching expression match.pd:1979, gimple-match-7.cc:91
...
@@ -48,10 +45,12 @@
   v.2_7 = v;
   _8 = _4 != v.2_7;
   _9 = VEC_COND_EXPR <_8, { -1, -1 }, { 0, 0 }>;
-  _10 = _3 > _9;
-  _11 = VEC_COND_EXPR <_10, { -1, -1 }, { 0, 0 }>;
+  _10 = VEC_COND_EXPR <_2, { 0, 0 }, _8>;
+  _18 = _4 == v.2_7;
+  _17 = _2 | _18;
+  _11 = VEC_COND_EXPR <_17, { 0, 0 }, { -1, -1 }>;
   _12 = VIEW_CONVERT_EXPR<V>(_11);
-  _13 = VIEW_CONVERT_EXPR<long unsigned int>(_12);
+  _13 = VIEW_CONVERT_EXPR<long unsigned int>(_11);
   if (_13 != 0)

Reply via email to