[PATCH] D113448: [AMDGPU] Check for unneeded shift mask in shift PatFrags.
Jay Foad via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 19 06:52:45 PST 2021
foad added inline comments.
================
Comment at: llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp:3887
+
+ const MachineInstr *Opnd1Def =
+ getOpcodeDef(TargetOpcode::G_CONSTANT, MI.getOperand(2).getReg(), *MRI);
----------------
abinavpp wrote:
> foad wrote:
> > foad wrote:
> > > Could use getIConstantVRegVal here to get the APInt value directly?
> > `Opnd1` is a bit confusing because it's MI.getOperand(2). Maybe call it something vague like MaskVal?
> For some reason, naming the operands as Val and MaskVal is confusing me, how about LHS and RHS?
Sure.
================
Comment at: llvm/test/CodeGen/AMDGPU/constrained-shift.ll:19
+; GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
+; GISEL-NEXT: v_and_b32_e32 v1, 15, v1
+; GISEL-NEXT: v_lshlrev_b16_e32 v2, v1, v0
----------------
abinavpp wrote:
> abinavpp wrote:
> > arsenm wrote:
> > > foad wrote:
> > > > abinavpp wrote:
> > > > > Do we see anything obvious in this change that's not allowing us to eliminate the `and` in global-isel for the divergent cases?
> > > > I think a cross-regbank copy is getting in the way of matching the constant value 15. Maybe use getIConstantVRegValWithLookThrough to look through the copy?
> > > This is another case where regbankselect or a the post regbank combiner should have materialized the constant in VGPR to begin with
> > > I think a cross-regbank copy is getting in the way of matching the constant value 15. Maybe use getIConstantVRegValWithLookThrough to look through the copy?
> >
> > getIConstantVRegValWithLookThrough() in the predicate alone won't help here
> > since we're not able to match the pattern in the first place.
> > This is another case where regbankselect or a the post regbank combiner should have materialized the constant in VGPR to begin with
>
> Doing something like:
> ```
> --- a/llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp
> +++ b/llvm/lib/CodeGen/GlobalISel/RegBankSelect.cpp
> @@ -472,6 +472,10 @@ RegBankSelect::MappingCost RegBankSelect::computeMapping(
> Register Reg = MO.getReg();
> if (!Reg)
> continue;
> +
> + if (MO.isUse() && isConstantOrConstantVector(*(MRI->getVRegDef(Reg)), *MRI))
> + continue;
> +
> LLVM_DEBUG(dbgs() << "Opd" << OpIdx << '\n');
> ```
> or forcing SGPRRegBank for constant operands in
> AMDGPURegisterBankInfo::getDefaultMappingVOP() fixes this problem buts ends up
> violating the constant bus restriction for a lot of AMDGPU tests.
>
> I'm not sure how the original PatFrags (i.e. the ones with the masks as literal
> constants without predicates) are working correctly in global-isel for *some*
> (vector cases and scalar 64-bit cases are not working) of the divergent cases.
>
> Is there a way to write a constant operand in a tblgen DAG that peeks through
> trivial cross regbank copies? Or, is there a better way to fix this?
Does D113784 help? Anyway see the discussion in that review about how to pick better banks for constants.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113448/new/
https://reviews.llvm.org/D113448
More information about the llvm-commits
mailing list