I had made the condition to strict before, here's an updated patch:

Hi All,

The previous check if a value was external was checking
!vect_get_internal_def (vinfo, var) but this of course isn't completely right
as they could reductions etc.

This changes the check to just explicitly look at externals and constants.
Note that reductions remain unhandled here, but we don't support codegen of
boolean reductions today anyway.

So at the time we do then this would have the be handled as well in lowering.

Bootstrapped Regtested on aarch64-none-linux-gnu, arm-none-linux-gnueabihf,
x86_64-pc-linux-gnu -m32, -m64 and no issues.

Ok for master?

Thanks,
Tamar

gcc/ChangeLog:

        PR tree-optimization/116817
        * tree-vect-patterns.cc (vect_recog_bool_pattern): Check for const or
        externals.

gcc/testsuite/ChangeLog:

        PR tree-optimization/116817
        * g++.dg/vect/pr116817.cc: New test.

-- inline copy of patch --

diff --git a/gcc/testsuite/g++.dg/vect/pr116817.cc 
b/gcc/testsuite/g++.dg/vect/pr116817.cc
new file mode 100644
index 
0000000000000000000000000000000000000000..7e28982fb138c2cccc4f956aedb03fa454d9d858
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr116817.cc
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+
+int main_ulData0;
+unsigned *main_pSrcBuffer;
+int main(void) {
+  int iSrc = 0;
+  bool bData0;
+  for (; iSrc < 4; iSrc++) {
+    if (bData0)
+      main_pSrcBuffer[iSrc] = main_ulData0;
+    else
+      main_pSrcBuffer[iSrc] = 0;
+    bData0 = !bData0;
+  }
+}
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index 
e7e877dd2adb55262822f1660f8d92b42d44e6d0..f0298b2ab97a1e7dd0d943340e1389c3c0fa796e
 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -6062,12 +6062,15 @@ vect_recog_bool_pattern (vec_info *vinfo,
       if (get_vectype_for_scalar_type (vinfo, type) == NULL_TREE)
        return NULL;
 
+      stmt_vec_info var_def_info = vinfo->lookup_def (var);
       if (check_bool_pattern (var, vinfo, bool_stmts))
        var = adjust_bool_stmts (vinfo, bool_stmts, type, stmt_vinfo);
       else if (integer_type_for_mask (var, vinfo))
        return NULL;
       else if (TREE_CODE (TREE_TYPE (var)) == BOOLEAN_TYPE
-              && !vect_get_internal_def (vinfo, var))
+              && (!var_def_info
+                  || STMT_VINFO_DEF_TYPE (var_def_info) == vect_external_def
+                  || STMT_VINFO_DEF_TYPE (var_def_info) == vect_constant_def))
        {
          /* If the condition is already a boolean then manually convert it to a
             mask of the given integer type but don't set a vectype.  */

Attachment: rb18806.patch
Description: rb18806.patch

Reply via email to