-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[AIE2] Support for allowing direct VEXTRACT to 20-bit registers #233
Conversation
llvm/test/CodeGen/AIE/aie2/GlobalISel/prelegalizercombiner-s20-narrowing.mir
Outdated
Show resolved
Hide resolved
llvm/test/CodeGen/AIE/aie2/GlobalISel/prelegalizercombiner-s20-narrowing.mir
Outdated
Show resolved
Hide resolved
Given that you mentioned there are no QoR gain, I would recommend you to re look at the instruction that consume S20 type reg. |
650d8a9
to
d5d7cf0
Compare
d5d7cf0
to
f12f1a4
Compare
MIRBuilder.buildAssertInstr(AssertExtOpcode, ExtReg20Bit, DstReg20Bit, | ||
SrcEltSize); | ||
MIRBuilder.buildInstr(ExtOpcode, {DstReg}, {ExtReg20Bit}); | ||
MI.eraseFromParent(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now we are safe ;-)
35027af
to
000b09e
Compare
000b09e
to
e7731e6
Compare
@@ -192,7 +190,6 @@ define void @above_threshold(i32 signext %in, ptr %out) nounwind { | |||
; RV64I-PIC-LABEL: above_threshold: | |||
; RV64I-PIC: # %bb.0: # %entry | |||
; RV64I-PIC-NEXT: li a2, 5 | |||
; RV64I-PIC-NEXT: sext.w a0, a0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice! Did you check all targets?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I have checked all targets.
/// To : %9:_(s20) = G_AIE_SEXT_EXTRACT_VECTOR_ELT %2(<32 x s16>), %0(s32) | ||
/// %10:_(s20) = G_ASSERT_[S/Z]EXT %9, 16 | ||
/// %4:_(s16) = G_TRUNC %10(s20) | ||
/// %5:_(s20) = G_[S/Z]EXT %4(s16) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to change the return types? I would expect that we only need to add a %10:_(s32) = G_ASSERT_[S/Z]EXT %9, 16
and keep the rest intact thanks to the new sext(trunc x)
combiner you added previously.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, we need to change the return types, because the pattern that is written in new sext(trunc x)
combiner will not match in this case as m_SpecificType is trying to match s20 but return type here is s32.
mi_match(SrcReg, MRI, m_GTrunc(m_all_of(m_Reg(Reg), m_SpecificType(DstTy))))
e7731e6
to
467672d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
2d5aaad
to
de8468e
Compare
de8468e
to
c3cba3e
Compare
%var:_(s32) = COPY $vgpr0 | ||
%assert:_(s32) = G_ASSERT_SEXT %var, 16 | ||
%trunc:_(s16) = G_TRUNC %assert(s32) | ||
%sext:_(s64) = G_SEXT %trunc(s16) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: I guess we could still eliminate the G_TRUNC
, and change G_SEXT
to extend from 32 -> 64
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This story requires a (sext (trunc x)) → x
combiner; we can create a new ticket for the G_TRUNC
elimination
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
agreed 👍
c3cba3e
to
fcf4285
Compare
fcf4285
to
14eea26
Compare
@@ -2465,6 +2465,20 @@ bool CombinerHelper::matchCombineZextTrunc(MachineInstr &MI, Register &Reg) { | |||
return false; | |||
} | |||
|
|||
bool CombinerHelper::matchCombineSextTrunc(MachineInstr &MI, Register &Reg) { | |||
assert(MI.getOpcode() == TargetOpcode::G_SEXT && "Expected a G_SEXT"); | |||
const Register DstReg = MI.getOperand(0).getReg(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: you could use const auto [DstReg, DstTy, SrcReg, SrcTy] = MI.getFirst2RegLLTs()
%var:_(s32) = COPY $vgpr0 | ||
%assert:_(s32) = G_ASSERT_SEXT %var, 16 | ||
%trunc:_(s16) = G_TRUNC %assert(s32) | ||
%sext:_(s64) = G_SEXT %trunc(s16) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
agreed 👍
MachineVerifier
has been updated to allowG_AIE_SEXT_EXTRACT_VECTOR_ELT
andG_AIE_ZEXT_EXTRACT_VECTOR_ELT
to accept 20-bit outputs.