This is an archive of the discontinued LLVM Phabricator instance.

[SystemZ, TableGen] Fix shift count handling
ClosedPublic

Authored by uweigand on Jul 31 2018, 12:01 PM.

Details

Summary

As noticed in https://reviews.llvm.org/D50018, the DAG combiner logic to simplify AND masks in shift counts are invalid.

While it is true that the SystemZ shift instructions ignore all but the low 6 bits of the shift count, it is still invalid to simplify the AND masks while the DAG still uses the standard shift operators (which are *not* defined to match the SystemZ instruction behavior).

Instead, this patch performs equivalent operations during instruction selection. For completely removing the AND, this now happens via additional DAG match patterns implemented by a multi-alternative PatFrags. For simplifying a 32-bit AND to a 16-bit AND, the existing DAG patterns were already mostly OK, they just needed an output XForm to actually truncate the immediate value.

Unfortunately, the latter change also exposed a bug in TableGen: it seems XForms are currently only handled correctly for direct operands of the outermost operation node. This patch also fixes that bug by simply recurring through the whole pattern.

Diff Detail

Repository
rL LLVM

Event Timeline

uweigand created this revision.Jul 31 2018, 12:01 PM

D50018 was spurred by failures in the Rust testsuite, and I've confirmed this patch also resolves those failures. Thanks!

This revision was not accepted when it landed; it landed in state Needs Review.Aug 1 2018, 4:58 AM
This revision was automatically updated to reflect the committed changes.