I am trying to improve code generation for coremark to match a recent
improvement that was made in LLVM.
I added the following transformation to match.pd which attempts to
replace a branch with straight line code:
/* (cond (and (x , 0x1) == 0), y, (z ^ y) ) -> (-(and (x , 0x1)) & z ) ^
y */
(simplify
(cond (eq (bit_and @0 integer_onep@1)
integer_zerop)
@2
(bit_xor:c @3 @2))
(bit_xor (bit_and (negate (bit_and @0 @1)) @3) @2))
I get a internal error, but in stepping through the debugger I can see
the pattern matches, but fails when when it tries to further simplify
and match another pattern in match.pd:
/* x & C -> x if we know that x & ~C == 0. */
#if GIMPLE
(simplify
(bit_and SSA_NAME@0 INTEGER_CST@1)
(if (INTEGRAL_TYPE_P (TREE_TYPE (@0))
&& wi::bit_and_not (get_nonzero_bits (@0), wi::to_wide (@1)) == 0)
@0))
#endif
The crash occurs in wi::bit_and_not. Before digging further I want to
ask if there is a problem with the way I wrote the transformation?