Skip to content

Commit b11c15a

Browse files
committed
WIP
1 parent c073821 commit b11c15a

File tree

4 files changed

+28
-41
lines changed

4 files changed

+28
-41
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3850,15 +3850,8 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) {
38503850
uint64_t TrueTSFlags = TrueMCID.TSFlags;
38513851
bool HasTiedDest = RISCVII::isFirstDefTiedToFirstUse(TrueMCID);
38523852

3853-
bool IsMasked = false;
38543853
const RISCV::RISCVMaskedPseudoInfo *Info =
38553854
RISCV::lookupMaskedIntrinsicByUnmasked(TrueOpc);
3856-
if (!Info && HasTiedDest) {
3857-
Info = RISCV::getMaskedPseudoInfo(TrueOpc);
3858-
IsMasked = true;
3859-
}
3860-
assert(!(IsMasked && !HasTiedDest) && "Expected tied dest");
3861-
38623855
if (!Info)
38633856
return false;
38643857

@@ -3870,19 +3863,6 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) {
38703863
return false;
38713864
}
38723865

3873-
// If True is masked then the vmerge must have either the same mask or an all
3874-
// 1s mask, since we're going to keep the mask from True.
3875-
if (IsMasked) {
3876-
// FIXME: Support mask agnostic True instruction which would have an
3877-
// undef passthru operand.
3878-
SDValue TrueMask =
3879-
getMaskSetter(True->getOperand(Info->MaskOpIdx),
3880-
True->getOperand(True->getNumOperands() - 1));
3881-
assert(TrueMask);
3882-
if (!usesAllOnesMask(Mask, Glue) && getMaskSetter(Mask, Glue) != TrueMask)
3883-
return false;
3884-
}
3885-
38863866
// Skip if True has side effect.
38873867
if (TII->get(TrueOpc).hasUnmodeledSideEffects())
38883868
return false;
@@ -3948,24 +3928,13 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) {
39483928
return false;
39493929
}
39503930

3951-
// If we end up changing the VL or mask of True, then we need to make sure it
3952-
// doesn't raise any observable fp exceptions, since changing the active
3953-
// elements will affect how fflags is set.
3954-
if (TrueVL != VL || !IsMasked)
3955-
if (mayRaiseFPException(True.getNode()) &&
3956-
!True->getFlags().hasNoFPExcept())
3957-
return false;
3931+
// Make sure it doesn't raise any observable fp exceptions, since changing the
3932+
// active elements will affect how fflags is set.
3933+
if (mayRaiseFPException(True.getNode()) && !True->getFlags().hasNoFPExcept())
3934+
return false;
39583935

39593936
SDLoc DL(N);
39603937

3961-
// From the preconditions we checked above, we know the mask and thus glue
3962-
// for the result node will be taken from True.
3963-
if (IsMasked) {
3964-
Mask = True->getOperand(Info->MaskOpIdx);
3965-
Glue = True->getOperand(True->getNumOperands() - 1);
3966-
assert(Glue.getValueType() == MVT::Glue);
3967-
}
3968-
39693938
unsigned MaskedOpc = Info->MaskedPseudo;
39703939
#ifndef NDEBUG
39713940
const MCInstrDesc &MaskedMCID = TII->get(MaskedOpc);
@@ -3995,8 +3964,7 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) {
39953964
Ops.push_back(False);
39963965

39973966
const bool HasRoundingMode = RISCVII::hasRoundModeOp(TrueTSFlags);
3998-
const unsigned NormalOpsEnd = TrueVLIndex - IsMasked - HasRoundingMode;
3999-
assert(!IsMasked || NormalOpsEnd == Info->MaskOpIdx);
3967+
const unsigned NormalOpsEnd = TrueVLIndex - HasRoundingMode;
40003968
Ops.append(True->op_begin() + HasTiedDest, True->op_begin() + NormalOpsEnd);
40013969

40023970
Ops.push_back(Mask);

llvm/lib/Target/RISCV/RISCVVectorPeephole.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,23 @@ bool RISCVVectorPeephole::convertVMergeToVMv(MachineInstr &MI) const {
358358
return false;
359359

360360
assert(MI.getOperand(4).isReg() && MI.getOperand(4).getReg() == RISCV::V0);
361-
if (!isAllOnesMask(V0Defs.lookup(&MI)))
361+
auto TrueHasSameMask = [&]() {
362+
MachineInstr *True = MRI->getVRegDef(MI.getOperand(3).getReg());
363+
if (!True)
364+
return false;
365+
const RISCV::RISCVMaskedPseudoInfo *Info =
366+
RISCV::getMaskedPseudoInfo(True->getOpcode());
367+
if (!Info)
368+
return false;
369+
if (True->getOperand(1).getReg() != RISCV::NoRegister &&
370+
TRI->lookThruCopyLike(True->getOperand(1).getReg(), MRI) !=
371+
TRI->lookThruCopyLike(FalseReg, MRI))
372+
return false;
373+
return V0Defs.lookup(True)->getOperand(1).getReg() ==
374+
V0Defs.lookup(&MI)->getOperand(1).getReg();
375+
};
376+
377+
if (!isAllOnesMask(V0Defs.lookup(&MI)) && !TrueHasSameMask())
362378
return false;
363379

364380
MI.setDesc(TII->get(NewOpc));

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-strided-load-store-asm.ll

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ define void @gather_masked(ptr noalias nocapture %A, ptr noalias nocapture reado
6363
; CHECK-NEXT: .LBB1_1: # %vector.body
6464
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
6565
; CHECK-NEXT: vmv1r.v v9, v8
66-
; CHECK-NEXT: vsetvli zero, a3, e8, m1, ta, mu
66+
; CHECK-NEXT: vsetvli zero, a3, e8, m1, tu, mu
6767
; CHECK-NEXT: vlse8.v v9, (a1), a4, v0.t
68+
; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, ma
6869
; CHECK-NEXT: vle8.v v10, (a0)
6970
; CHECK-NEXT: vadd.vv v9, v10, v9
7071
; CHECK-NEXT: vse8.v v9, (a0)
@@ -344,10 +345,12 @@ define void @scatter_masked(ptr noalias nocapture %A, ptr noalias nocapture read
344345
; CHECK-NEXT: li a4, 5
345346
; CHECK-NEXT: .LBB7_1: # %vector.body
346347
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
347-
; CHECK-NEXT: vsetvli zero, a3, e8, m1, ta, mu
348+
; CHECK-NEXT: vsetvli zero, a3, e8, m1, ta, ma
348349
; CHECK-NEXT: vle8.v v9, (a1)
349350
; CHECK-NEXT: vmv1r.v v10, v8
351+
; CHECK-NEXT: vsetvli zero, zero, e8, m1, tu, mu
350352
; CHECK-NEXT: vlse8.v v10, (a0), a4, v0.t
353+
; CHECK-NEXT: vsetvli zero, zero, e8, m1, ta, ma
351354
; CHECK-NEXT: vadd.vv v9, v10, v9
352355
; CHECK-NEXT: vsse8.v v9, (a0), a4, v0.t
353356
; CHECK-NEXT: addi a1, a1, 32

llvm/test/CodeGen/RISCV/rvv/rvv-peephole-vmerge-vops.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1181,7 +1181,7 @@ define <vscale x 2 x i32> @true_tied_dest_vmerge_implicit_passthru(<vscale x 2 x
11811181
define <vscale x 2 x i32> @true_mask_vmerge_implicit_passthru(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %avl) {
11821182
; CHECK-LABEL: true_mask_vmerge_implicit_passthru:
11831183
; CHECK: # %bb.0:
1184-
; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, mu
1184+
; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, mu
11851185
; CHECK-NEXT: vadd.vv v8, v9, v10, v0.t
11861186
; CHECK-NEXT: ret
11871187
%a = call <vscale x 2 x i32> @llvm.riscv.vadd.mask.nxv2i32.nxv2i32(<vscale x 2 x i32> %passthru, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, <vscale x 2 x i1> %m, i64 %avl, i64 0)

0 commit comments

Comments
 (0)