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

--- Comment #3 from Dominik Vogt <vogt at linux dot vnet.ibm.com> ---
(In reply to Richard Biener from comment #2)
> of course needs to be conditional on oldlhs being bool and lhs being
> integral.

Like so?

--
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 9fd45d1..e5e448e 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -3581,7 +3581,12 @@ fold_builtin_atomic_compare_exchange
(gimple_stmt_iterator *gsi)
        }
       else
        gsi_insert_after (gsi, g, GSI_NEW_STMT);
-      g = gimple_build_assign (oldlhs, NOP_EXPR, gimple_assign_lhs (g));
+      if (TREE_CODE (TREE_TYPE (oldlhs)) == BOOLEAN_TYPE
+         && INTEGRAL_TYPE_P (itype))
+       g = gimple_build_assign (oldlhs, NE_EXPR, gimple_assign_lhs (g),
+                                build_zero_cst (TREE_TYPE (gimple_assign_lhs
(g))));
+      else
+       g = gimple_build_assign (oldlhs, NOP_EXPR, gimple_assign_lhs (g));
       gsi_insert_after (gsi, g, GSI_NEW_STMT);
     }
   g = gimple_build_assign (make_ssa_name (itype), REALPART_EXPR,
--

Lhs has COMPLEX_TYPE, so itype needs to be checked instead, but is it really
necessary?  Itype comes from the function declaration and should be guaranteed
to be of integral type anyway:

  tree fndecl = gimple_call_fndecl (stmt); 
  tree parmt = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); 
  tree itype = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (parmt))); 

This eliminates the _Bool and finally results in

  _8 = IMAGPART_EXPR <_7>;
  if (_8 != 0)

(but not regression tested yet).

Reply via email to