On Fri, 12 Jun 2015, Richard Biener wrote:

Not judging at all whether it is desirable or not, but you might have hit the issue that when you want several convert?, you need to use the spelling convert1?, convert2?, and it stops there, while here you would probably want at least 4 (maybe 6?) for this case. You might be able to work around it with a user-defined predicate, but I keep getting errors like
generic-match.c:6655:16: error: redeclaration of ‘tree_node* o20_pops [2]’

If you want to reproduce the error (this is probably not good as is, it is only provided as a reproducer)

(match (nopand @0 @1)
 (bit_and (convert1? @0) (convert2? @1))
 (if (tree_nop_conversion_p (type, TREE_TYPE (@0))
      && tree_nop_conversion_p (type, TREE_TYPE (@1)))))
(match (nopior @0 @1)
 (bit_ior (convert1? @0) (convert2? @1))
 (if (tree_nop_conversion_p (type, TREE_TYPE (@0))
      && tree_nop_conversion_p (type, TREE_TYPE (@1)))))
(simplify
 (bit_xor:c (convert1? (nopand@2 @0 @1))
            (convert2? (nopior@3 @0 @1)))
 (if (tree_nop_conversion_p (type, TREE_TYPE (@2))
      && tree_nop_conversion_p (type, TREE_TYPE (@3)))
  (bit_xor (convert @0) (convert @1))))


fold-const.c traditionally avoided the combinatorial explosion by using
strip_nops.

Yeah. We can probably special case conditional conversions in code generation instead of lowering it. And then go the full way and special case nop conversions so you can avoid writing the predicate as well.

Without special casing, I currently have:

(match (nopcvt @0)
 (convert? @0)
 (if (tree_nop_conversion_p (type, TREE_TYPE (@0)))))
(simplify
 (bit_xor:c (convert1? (bit_and@2 (nopcvt @0) (nopcvt @1)))
            (convert2? (bit_ior:c (nopcvt @0) (nopcvt @1))))
 (if (tree_nop_conversion_p (type, TREE_TYPE (@2)))
  (bit_xor (convert @0) (convert @1))))

which simplifies Jakub's testcase without exploding the size of *-match.c, but it is still not very satisfying.

--
Marc Glisse

Reply via email to