This is an archive of the discontinued LLVM Phabricator instance.

[mips] Provide alternate predicates for constant synthesis
ClosedPublic

Authored by smaksimovic on Oct 12 2017, 3:32 AM.

Details

Summary

Ordering of patterns should not be of importance anymore since the predicates used are mutually exclusive now.

Diff Detail

Event Timeline

smaksimovic created this revision.Oct 12 2017, 3:32 AM

We could, in addition to the new predicates, reorder the patterns which use them resulting in exposure of the underlying dependence of the order the patterns are laid out.
I stuck with Val & 0xfff instead of suggested isUInt<16>(Val) since it seems that it behaves differently.

sdardis edited edge metadata.Oct 12 2017, 3:55 AM

Some quick inlined comments.

Can you provide a test case where you check the various edge values and use a combination of CHECK and CHECK-NOT to assert that the ISel is picking the expected instructions?

E.g.

define i32 @ret_zero() {
  CHECK-MIPS:     addiu $2, $zero, 0
  CHECK-MIPS-NOT: lui
  CHECK-MIPS-NOT: ori
  CHECK-MIPS-NOT: li16
 
  ret i32 0
}

The goal of the test case is to document what's "canonical" for us in terms of constant materialisation or at least the current behaviour.

lib/Target/Mips/MicroMipsInstrInfo.td
1008–1009

Use AdditionalPredicates with a scope to cover both the def and multidef.

1010–1012

Delete these patterns, they are covered by the MaterializeImms multiclass and the explict pattern for LI16_MM above.

lib/Target/Mips/MipsInstrInfo.td
2732–2746

Your suggestion for reordering the predicates is a good one, can you invert the order and add a comment saying why they are in an unusual order?

Addressed review comments.

sdardis accepted this revision.Oct 16 2017, 4:27 AM

LGTM with inline nits addressed.

lib/Target/Mips/MipsInstrInfo.td
1850–1865

These should go in the block of other leaf patterns starting at 1155.

1853–1854

You can return the result of isUInt<16>(ZVal) && !isInt<16> directly, as isUInt<16> already tests

return static_cast<int16_t>(x) == x;

See include/llvm/Support/MathExtras.h

test/CodeGen/Mips/constMaterialization.ll
4

Add a comment here explaining that this test documents/tests the patterns used for constant materialization.

8

This check line needs to be indented to the same level as the check lines below. This applies to the rest of the functions in this test.

36

This should be ALL.

76

Stray whitespace here and in the rest of the functions at the same location.

91

Check that a negative number that doesn't have the lower 16 bits is synthesized with a single lui.

This revision is now accepted and ready to land.Oct 16 2017, 4:27 AM
smaksimovic edited the summary of this revision. (Show Details)

Nits addressed.

smaksimovic closed this revision.Oct 16 2017, 6:20 AM