This is an archive of the discontinued LLVM Phabricator instance.

[AARCH64][NEON] Allow to sink operands of aarch64_neon_pmull64.
ClosedPublic

Authored by avl on May 20 2020, 1:51 PM.

Details

Summary

This patch fixes a problem when pmull2 instruction is not
generated for vmull_high_p64 intrinsic.

ISel has a pattern for int_aarch64_neon_pmull64 intrinsic to generate
PMULL2 instruction. That pattern assumes that extraction operations
are located in the same basic block. We need to sink them
if they are not. Handle operands of int_aarch64_neon_pmull64
into AArch64TargetLowering::shouldSinkOperands.

Diff Detail

Event Timeline

avl created this revision.May 20 2020, 1:51 PM
efriedma added inline comments.May 20 2020, 3:34 PM
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
9403

Op can't be null.

9408

CI->getValue()

9411

VectorType::getNumElements() is deprecated; please dyn_cast<> to FixedVectorType.

9416

The check for the size is redundant; a two-element vector with i64 elements must be a 128-bit vector.

9436

getArgOperand()

dmgreen added inline comments.
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
9407

This wouldn't return false on non-constant operands either. (Not that I would expect that to come up much!)

You might find that the m_ExtractElement style pattern matchers make this simpler to handle.

avl updated this revision to Diff 265522.May 21 2020, 9:34 AM

addressed comments.

efriedma accepted this revision.May 21 2020, 11:14 AM

LGTM with a couple minor nits.

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
9409

cast<>

9439

getArgOperandUse

This revision is now accepted and ready to land.May 21 2020, 11:14 AM
avl added a comment.May 21 2020, 12:08 PM

Thank you.

This revision was automatically updated to reflect the committed changes.