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

--- Comment #4 from Tom de Vries <vries at gcc dot gnu.org> ---
This fixes it:
...
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index d932d74cb03..f2ac8f98e32 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -6734,7 +6734,21 @@ lower_rec_input_clauses (tree clauses, gimple_seq
*ilist, gimpl
e_seq *dlist,
                          x = build_call_expr_internal_loc
                            (UNKNOWN_LOCATION, IFN_GOMP_SIMT_XCHG_BFLY,
                             TREE_TYPE (ivar), 2, ivar, simt_lane);
-                         x = build2 (code, TREE_TYPE (ivar), ivar, x);
+                         /* Make sure x is evaluated unconditionally.  */
+                         enum tree_code update_code;
+                         switch (OMP_CLAUSE_REDUCTION_CODE (c))
+                           {
+                           case TRUTH_ANDIF_EXPR:
+                             update_code = TRUTH_AND_EXPR;
+                             break;
+                           case TRUTH_ORIF_EXPR:
+                             update_code = TRUTH_OR_EXPR;
+                             break;
+                           default:
+                             update_code = code;
+                             break;
+                           }
+                         x = build2 (update_code, TREE_TYPE (ivar), ivar, x);
                          gimplify_assign (ivar, x, &llist[2]);
                        }
                      tree ivar2 = ivar;
...

Reply via email to