[tablegen][globalisel] Add support for nested instruction matching.


[tablegen][globalisel] Add support for nested instruction matching.

Lift the restrictions that prevented the tree walking introduced in the
previous change and add support for patterns like:

(G_ADD (G_MUL (G_SEXT $src1), (G_SEXT $src2)), $src3) -> SMADDWrrr $dst, $src1, $src2, $src3

Also adds support for G_SEXT and G_ZEXT to support these cases.

One particular aspect of this that I should draw attention to is that I've
tried to be overly conservative in determining the safety of matches that
involve non-adjacent instructions and multiple basic blocks. This is intended
to be used as a cheap initial check and we may add a more expensive check in
the future. The current rules are:

  • Reject if any instruction may load/store (we'd need to check for intervening memory operations.
  • Reject if any instruction has implicit operands.
  • Reject if any instruction has unmodelled side-effects.

See isObviouslySafeToFold().

Reviewers: t.p.northover, javed.absar, qcolombet, aditya_nandakumar, ab, rovka

Reviewed By: ab

Subscribers: igorb, dberris, llvm-commits, kristof.beyls

Differential Revision: https://reviews.llvm.org/D30539