[Bug tree-optimization/103194] [12 Regression] ice in optimize_atomic_bit_test_and with __sync_fetch_and_and since r12-5102-gfb161782545224f5

crazylht at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon Nov 15 08:32:45 GMT 2021


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

--- Comment #9 from Hongtao.liu <crazylht at gmail dot com> ---
(In reply to H.J. Lu from comment #6)
> Created attachment 51785 [details]
> The v2 incomplete patch
> 
> Hongtao, please finish it.  Thanks.

I'm trying to handle narrowing part in match.pd and add else return; when
precision is not equal.

(for bit_op (bit_and bit_xor bit_ior)
 (simplify
  (bit_op (convert@0 @1) (convert@2 @3))
  (if (INTEGRAL_TYPE_P (type)
      && INTEGRAL_TYPE_P (TREE_TYPE (@1))
      && tree_nop_conversion_p (TREE_TYPE (@1), TREE_TYPE (@3))
      && single_use (@0)
      && single_use (@2)
      && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (@1)))
   (with { tree type1 = TREE_TYPE (@1); }
    (convert (bit_op @1 (convert:type1 @3)))))))

(for bit_op (bit_and bit_xor bit_ior)
 (simplify
  (bit_op (convert@0 @1) INTEGER_CST@2)
  (if (INTEGRAL_TYPE_P (type)
      && INTEGRAL_TYPE_P (TREE_TYPE (@1))
      && single_use (@0)
      && TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (@1)))
   (convert (bit_op @1 { fold_convert (TREE_TYPE (@1), @2); })))))


More information about the Gcc-bugs mailing list