| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // A node is found in CSEMap only if AddNodeIDCustom reproduces the key its |
| // creator looked it up by. Each test builds a node twice and expects one node. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "SelectionDAGTestBase.h" |
| #include "llvm/CodeGen/MachineFunction.h" |
| #include "llvm/CodeGen/MachineMemOperand.h" |
| #include "llvm/CodeGen/TargetOpcodes.h" |
| #include "llvm/MC/MCContext.h" |
| |
| namespace llvm { |
| |
| class SelectionDAGCSETest : public SelectionDAGTestBase { |
| protected: |
| SDLoc Loc; |
| |
| SDValue getChain() { return DAG->getEntryNode(); } |
| |
| MachineMemOperand *getMMO(uint64_t Size = 4, |
| AtomicOrdering Order = AtomicOrdering::NotAtomic) { |
| return MF->getMachineMemOperand( |
| MachinePointerInfo(), |
| MachineMemOperand::MOLoad | MachineMemOperand::MOStore, Size, Align(4), |
| MMOMetadata(), SyncScope::System, Order); |
| } |
| }; |
| |
| TEST_F(SelectionDAGCSETest, AtomicRMW) { |
| SDValue Ptr = DAG->CreateStackTemporary(MVT::i32); |
| SDValue Val = DAG->getConstant(1, Loc, MVT::i32); |
| MachineMemOperand *MMO = getMMO(4, AtomicOrdering::SequentiallyConsistent); |
| auto Atomic = [&] { |
| return DAG |
| ->getAtomic(ISD::ATOMIC_LOAD_UINC_WRAP, Loc, MVT::i32, getChain(), Ptr, |
| Val, MMO) |
| .getNode(); |
| }; |
| EXPECT_EQ(Atomic(), Atomic()); |
| } |
| |
| TEST_F(SelectionDAGCSETest, DeactivationSymbol) { |
| EXPECT_EQ(DAG->getDeactivationSymbol(G).getNode(), |
| DAG->getDeactivationSymbol(G).getNode()); |
| EXPECT_NE(DAG->getDeactivationSymbol(G).getNode(), |
| DAG->getDeactivationSymbol(AliasedG).getNode()); |
| } |
| |
| TEST_F(SelectionDAGCSETest, EHLabel) { |
| MCSymbol *Sym = MF->getContext().createTempSymbol(); |
| MCSymbol *Other = MF->getContext().createTempSymbol(); |
| EXPECT_EQ(DAG->getEHLabel(Loc, getChain(), Sym).getNode(), |
| DAG->getEHLabel(Loc, getChain(), Sym).getNode()); |
| EXPECT_NE(DAG->getEHLabel(Loc, getChain(), Sym).getNode(), |
| DAG->getEHLabel(Loc, getChain(), Other).getNode()); |
| } |
| |
| TEST_F(SelectionDAGCSETest, ExtStridedLoadVP) { |
| SDValue Ptr = DAG->CreateStackTemporary(MVT::v2i64); |
| SDValue Stride = DAG->getConstant(8, Loc, MVT::i64); |
| SDValue Mask = DAG->getConstant(1, Loc, MVT::v2i1); |
| SDValue EVL = DAG->getConstant(2, Loc, MVT::i32); |
| MachineMemOperand *MMO = getMMO(8); |
| auto Load = [&] { |
| return DAG |
| ->getExtStridedLoadVP(ISD::EXTLOAD, Loc, MVT::v2i64, getChain(), Ptr, |
| Stride, Mask, EVL, MVT::v2i32, MMO) |
| .getNode(); |
| }; |
| EXPECT_EQ(Load(), Load()); |
| } |
| |
| TEST_F(SelectionDAGCSETest, FPEnvMem) { |
| SDValue Ptr = DAG->CreateStackTemporary(MVT::i32); |
| MachineMemOperand *MMO = getMMO(); |
| EXPECT_EQ(DAG->getGetFPEnv(getChain(), Loc, Ptr, MVT::i32, MMO).getNode(), |
| DAG->getGetFPEnv(getChain(), Loc, Ptr, MVT::i32, MMO).getNode()); |
| EXPECT_EQ(DAG->getSetFPEnv(getChain(), Loc, Ptr, MVT::i32, MMO).getNode(), |
| DAG->getSetFPEnv(getChain(), Loc, Ptr, MVT::i32, MMO).getNode()); |
| } |
| |
| TEST_F(SelectionDAGCSETest, LifetimeNode) { |
| SDValue FIPtr = DAG->CreateStackTemporary(MVT::i32); |
| int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex(); |
| EXPECT_EQ(DAG->getLifetimeNode(true, Loc, getChain(), FI).getNode(), |
| DAG->getLifetimeNode(true, Loc, getChain(), FI).getNode()); |
| } |
| |
| TEST_F(SelectionDAGCSETest, MorphMemIntrinsicToMachineNode) { |
| SDValue Ptr = DAG->CreateStackTemporary(MVT::i32); |
| SDVTList VTs = DAG->getVTList(MVT::i32, MVT::Other); |
| SDValue Ops[] = {getChain(), Ptr}; |
| SDNode *N = DAG->getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN, Loc, VTs, Ops, |
| MVT::i32, getMMO()) |
| .getNode(); |
| unsigned Opc = TargetOpcode::COPY; |
| ASSERT_EQ(DAG->MorphNodeTo(N, ~Opc, VTs, Ops), N); |
| EXPECT_EQ(DAG->getMachineNode(Opc, Loc, VTs, Ops), N); |
| } |
| |
| TEST_F(SelectionDAGCSETest, PseudoProbeNode) { |
| EXPECT_EQ(DAG->getPseudoProbeNode(Loc, getChain(), 1234, 5, 7).getNode(), |
| DAG->getPseudoProbeNode(Loc, getChain(), 1234, 5, 7).getNode()); |
| EXPECT_NE(DAG->getPseudoProbeNode(Loc, getChain(), 1234, 5, 7).getNode(), |
| DAG->getPseudoProbeNode(Loc, getChain(), 1234, 5, 8).getNode()); |
| } |
| |
| } // namespace llvm |