1cab029f4SScott Linder //===- llvm/unittest/CodeGen/AArch64SelectionDAGTest.cpp -------------------------===// 2cab029f4SScott Linder // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6cab029f4SScott Linder // 7cab029f4SScott Linder //===----------------------------------------------------------------------===// 8cab029f4SScott Linder 983ae1717SDavid Green #include "../lib/Target/AArch64/AArch64ISelLowering.h" 10dbca8a49SDavid Green #include "llvm/Analysis/MemoryLocation.h" 11cab029f4SScott Linder #include "llvm/Analysis/OptimizationRemarkEmitter.h" 12cab029f4SScott Linder #include "llvm/AsmParser/Parser.h" 13cab029f4SScott Linder #include "llvm/CodeGen/MachineModuleInfo.h" 141673a080SSimon Pilgrim #include "llvm/CodeGen/SelectionDAG.h" 15cab029f4SScott Linder #include "llvm/CodeGen/TargetLowering.h" 16dbca8a49SDavid Green #include "llvm/IR/MDBuilder.h" 174169338eSNikita Popov #include "llvm/IR/Module.h" 1889b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h" 191673a080SSimon Pilgrim #include "llvm/Support/KnownBits.h" 20cab029f4SScott Linder #include "llvm/Support/SourceMgr.h" 21cab029f4SScott Linder #include "llvm/Support/TargetSelect.h" 22cab029f4SScott Linder #include "llvm/Target/TargetMachine.h" 23cab029f4SScott Linder #include "gtest/gtest.h" 24cab029f4SScott Linder 25937cb7a8SSander de Smalen namespace llvm { 26cab029f4SScott Linder 27884619fcSScott Linder class AArch64SelectionDAGTest : public testing::Test { 28884619fcSScott Linder protected: 29884619fcSScott Linder static void SetUpTestCase() { 30cab029f4SScott Linder InitializeAllTargets(); 31cab029f4SScott Linder InitializeAllTargetMCs(); 32cab029f4SScott Linder } 33cab029f4SScott Linder 34cab029f4SScott Linder void SetUp() override { 35cab029f4SScott Linder StringRef Assembly = "define void @f() { ret void }"; 36cab029f4SScott Linder 37cab029f4SScott Linder Triple TargetTriple("aarch64--"); 38cab029f4SScott Linder std::string Error; 39cab029f4SScott Linder const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error); 40cab029f4SScott Linder // FIXME: These tests do not depend on AArch64 specifically, but we have to 41cab029f4SScott Linder // initialize a target. A skeleton Target for unittests would allow us to 42cab029f4SScott Linder // always run these tests. 43cab029f4SScott Linder if (!T) 445bbf1feaSIgor Kudrin GTEST_SKIP(); 45cab029f4SScott Linder 46cab029f4SScott Linder TargetOptions Options; 47*bb3f5e1fSMatin Raayai TM = std::unique_ptr<TargetMachine>( 48b6a01caaSKazu Hirata T->createTargetMachine("AArch64", "", "+sve", Options, std::nullopt, 49*bb3f5e1fSMatin Raayai std::nullopt, CodeGenOptLevel::Aggressive)); 50cab029f4SScott Linder if (!TM) 515bbf1feaSIgor Kudrin GTEST_SKIP(); 52cab029f4SScott Linder 53cab029f4SScott Linder SMDiagnostic SMError; 54cab029f4SScott Linder M = parseAssemblyString(Assembly, SMError, Context); 55cab029f4SScott Linder if (!M) 56cab029f4SScott Linder report_fatal_error(SMError.getMessage()); 57cab029f4SScott Linder M->setDataLayout(TM->createDataLayout()); 58cab029f4SScott Linder 59cab029f4SScott Linder F = M->getFunction("f"); 60cab029f4SScott Linder if (!F) 61cab029f4SScott Linder report_fatal_error("F?"); 62cab029f4SScott Linder 63cab029f4SScott Linder MachineModuleInfo MMI(TM.get()); 64cab029f4SScott Linder 6563e16478SMatt Arsenault MF = std::make_unique<MachineFunction>(*F, *TM, *TM->getSubtargetImpl(*F), 6663e16478SMatt Arsenault MMI.getContext(), 0); 67cab029f4SScott Linder 680a1aa6cdSArthur Eubanks DAG = std::make_unique<SelectionDAG>(*TM, CodeGenOptLevel::None); 69cab029f4SScott Linder if (!DAG) 70cab029f4SScott Linder report_fatal_error("DAG?"); 71cab029f4SScott Linder OptimizationRemarkEmitter ORE(F); 72455990d1SVitaly Buka DAG->init(*MF, ORE, nullptr, nullptr, nullptr, nullptr, nullptr, MMI, 73455990d1SVitaly Buka nullptr); 74cab029f4SScott Linder } 75cab029f4SScott Linder 76937cb7a8SSander de Smalen TargetLoweringBase::LegalizeTypeAction getTypeAction(EVT VT) { 77937cb7a8SSander de Smalen return DAG->getTargetLoweringInfo().getTypeAction(Context, VT); 78937cb7a8SSander de Smalen } 79937cb7a8SSander de Smalen 80937cb7a8SSander de Smalen EVT getTypeToTransformTo(EVT VT) { 81937cb7a8SSander de Smalen return DAG->getTargetLoweringInfo().getTypeToTransformTo(Context, VT); 82937cb7a8SSander de Smalen } 83937cb7a8SSander de Smalen 84cab029f4SScott Linder LLVMContext Context; 85*bb3f5e1fSMatin Raayai std::unique_ptr<TargetMachine> TM; 86cab029f4SScott Linder std::unique_ptr<Module> M; 87cab029f4SScott Linder Function *F; 88cab029f4SScott Linder std::unique_ptr<MachineFunction> MF; 89cab029f4SScott Linder std::unique_ptr<SelectionDAG> DAG; 90cab029f4SScott Linder }; 91cab029f4SScott Linder 92cab029f4SScott Linder TEST_F(AArch64SelectionDAGTest, computeKnownBits_ZERO_EXTEND_VECTOR_INREG) { 93cab029f4SScott Linder SDLoc Loc; 94cab029f4SScott Linder auto Int8VT = EVT::getIntegerVT(Context, 8); 95cab029f4SScott Linder auto Int16VT = EVT::getIntegerVT(Context, 16); 96cab029f4SScott Linder auto InVecVT = EVT::getVectorVT(Context, Int8VT, 4); 97cab029f4SScott Linder auto OutVecVT = EVT::getVectorVT(Context, Int16VT, 2); 98cab029f4SScott Linder auto InVec = DAG->getConstant(0, Loc, InVecVT); 991ba86188SCraig Topper auto Op = DAG->getNode(ISD::ZERO_EXTEND_VECTOR_INREG, Loc, OutVecVT, InVec); 1008cca8bd4SCraig Topper auto DemandedElts = APInt(2, 3); 101148957f3SSimon Pilgrim KnownBits Known = DAG->computeKnownBits(Op, DemandedElts); 102cab029f4SScott Linder EXPECT_TRUE(Known.isZero()); 103cab029f4SScott Linder } 104cab029f4SScott Linder 105bd97342aSDavid Sherwood TEST_F(AArch64SelectionDAGTest, computeKnownBitsSVE_ZERO_EXTEND_VECTOR_INREG) { 106bd97342aSDavid Sherwood SDLoc Loc; 107bd97342aSDavid Sherwood auto Int8VT = EVT::getIntegerVT(Context, 8); 108bd97342aSDavid Sherwood auto Int16VT = EVT::getIntegerVT(Context, 16); 109bd97342aSDavid Sherwood auto InVecVT = EVT::getVectorVT(Context, Int8VT, 4, true); 110bd97342aSDavid Sherwood auto OutVecVT = EVT::getVectorVT(Context, Int16VT, 2, true); 111bd97342aSDavid Sherwood auto InVec = DAG->getConstant(0, Loc, InVecVT); 112bd97342aSDavid Sherwood auto Op = DAG->getNode(ISD::ZERO_EXTEND_VECTOR_INREG, Loc, OutVecVT, InVec); 113bd97342aSDavid Sherwood auto DemandedElts = APInt(2, 3); 114bd97342aSDavid Sherwood KnownBits Known = DAG->computeKnownBits(Op, DemandedElts); 115bd97342aSDavid Sherwood 116bd97342aSDavid Sherwood // We don't know anything for SVE at the moment. 117bd97342aSDavid Sherwood EXPECT_EQ(Known.Zero, APInt(16, 0u)); 118bd97342aSDavid Sherwood EXPECT_EQ(Known.One, APInt(16, 0u)); 119bd97342aSDavid Sherwood EXPECT_FALSE(Known.isZero()); 120bd97342aSDavid Sherwood } 121bd97342aSDavid Sherwood 122cab029f4SScott Linder TEST_F(AArch64SelectionDAGTest, computeKnownBits_EXTRACT_SUBVECTOR) { 123cab029f4SScott Linder SDLoc Loc; 124cab029f4SScott Linder auto IntVT = EVT::getIntegerVT(Context, 8); 125cab029f4SScott Linder auto VecVT = EVT::getVectorVT(Context, IntVT, 3); 126cab029f4SScott Linder auto IdxVT = EVT::getIntegerVT(Context, 64); 127cab029f4SScott Linder auto Vec = DAG->getConstant(0, Loc, VecVT); 128cab029f4SScott Linder auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT); 129cab029f4SScott Linder auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx); 130cab029f4SScott Linder auto DemandedElts = APInt(3, 7); 131148957f3SSimon Pilgrim KnownBits Known = DAG->computeKnownBits(Op, DemandedElts); 132cab029f4SScott Linder EXPECT_TRUE(Known.isZero()); 133cab029f4SScott Linder } 134cab029f4SScott Linder 135cab029f4SScott Linder TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_SIGN_EXTEND_VECTOR_INREG) { 136cab029f4SScott Linder SDLoc Loc; 137cab029f4SScott Linder auto Int8VT = EVT::getIntegerVT(Context, 8); 138cab029f4SScott Linder auto Int16VT = EVT::getIntegerVT(Context, 16); 139cab029f4SScott Linder auto InVecVT = EVT::getVectorVT(Context, Int8VT, 4); 140cab029f4SScott Linder auto OutVecVT = EVT::getVectorVT(Context, Int16VT, 2); 141cab029f4SScott Linder auto InVec = DAG->getConstant(1, Loc, InVecVT); 1421ba86188SCraig Topper auto Op = DAG->getNode(ISD::SIGN_EXTEND_VECTOR_INREG, Loc, OutVecVT, InVec); 1438cca8bd4SCraig Topper auto DemandedElts = APInt(2, 3); 144cab029f4SScott Linder EXPECT_EQ(DAG->ComputeNumSignBits(Op, DemandedElts), 15u); 145cab029f4SScott Linder } 146cab029f4SScott Linder 1479e811b0dSDavid Sherwood TEST_F(AArch64SelectionDAGTest, ComputeNumSignBitsSVE_SIGN_EXTEND_VECTOR_INREG) { 1489e811b0dSDavid Sherwood SDLoc Loc; 1499e811b0dSDavid Sherwood auto Int8VT = EVT::getIntegerVT(Context, 8); 1509e811b0dSDavid Sherwood auto Int16VT = EVT::getIntegerVT(Context, 16); 1519e811b0dSDavid Sherwood auto InVecVT = EVT::getVectorVT(Context, Int8VT, 4, /*IsScalable=*/true); 1529e811b0dSDavid Sherwood auto OutVecVT = EVT::getVectorVT(Context, Int16VT, 2, /*IsScalable=*/true); 1539e811b0dSDavid Sherwood auto InVec = DAG->getConstant(1, Loc, InVecVT); 1549e811b0dSDavid Sherwood auto Op = DAG->getNode(ISD::SIGN_EXTEND_VECTOR_INREG, Loc, OutVecVT, InVec); 1559e811b0dSDavid Sherwood auto DemandedElts = APInt(2, 3); 1569e811b0dSDavid Sherwood EXPECT_EQ(DAG->ComputeNumSignBits(Op, DemandedElts), 1u); 1579e811b0dSDavid Sherwood } 1589e811b0dSDavid Sherwood 159cab029f4SScott Linder TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_EXTRACT_SUBVECTOR) { 160cab029f4SScott Linder SDLoc Loc; 161cab029f4SScott Linder auto IntVT = EVT::getIntegerVT(Context, 8); 162cab029f4SScott Linder auto VecVT = EVT::getVectorVT(Context, IntVT, 3); 163cab029f4SScott Linder auto IdxVT = EVT::getIntegerVT(Context, 64); 164cab029f4SScott Linder auto Vec = DAG->getConstant(1, Loc, VecVT); 165cab029f4SScott Linder auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT); 166cab029f4SScott Linder auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx); 167cab029f4SScott Linder auto DemandedElts = APInt(3, 7); 168cab029f4SScott Linder EXPECT_EQ(DAG->ComputeNumSignBits(Op, DemandedElts), 7u); 169cab029f4SScott Linder } 170cab029f4SScott Linder 17183ae1717SDavid Green TEST_F(AArch64SelectionDAGTest, ComputeNumSignBits_VASHR) { 17283ae1717SDavid Green SDLoc Loc; 17383ae1717SDavid Green auto VecVT = MVT::v8i8; 17483ae1717SDavid Green auto Shift = DAG->getConstant(4, Loc, MVT::i32); 17583ae1717SDavid Green auto Vec0 = DAG->getConstant(1, Loc, VecVT); 17683ae1717SDavid Green auto Op1 = DAG->getNode(AArch64ISD::VASHR, Loc, VecVT, Vec0, Shift); 17783ae1717SDavid Green EXPECT_EQ(DAG->ComputeNumSignBits(Op1), 8u); 17883ae1717SDavid Green auto VecA = DAG->getConstant(0xaa, Loc, VecVT); 17983ae1717SDavid Green auto Op2 = DAG->getNode(AArch64ISD::VASHR, Loc, VecVT, VecA, Shift); 18083ae1717SDavid Green EXPECT_EQ(DAG->ComputeNumSignBits(Op2), 5u); 18183ae1717SDavid Green } 18283ae1717SDavid Green 183cab029f4SScott Linder TEST_F(AArch64SelectionDAGTest, SimplifyDemandedVectorElts_EXTRACT_SUBVECTOR) { 184cab029f4SScott Linder TargetLowering TL(*TM); 185cab029f4SScott Linder 186cab029f4SScott Linder SDLoc Loc; 187cab029f4SScott Linder auto IntVT = EVT::getIntegerVT(Context, 8); 188cab029f4SScott Linder auto VecVT = EVT::getVectorVT(Context, IntVT, 3); 189cab029f4SScott Linder auto IdxVT = EVT::getIntegerVT(Context, 64); 190cab029f4SScott Linder auto Vec = DAG->getConstant(1, Loc, VecVT); 191cab029f4SScott Linder auto ZeroIdx = DAG->getConstant(0, Loc, IdxVT); 192cab029f4SScott Linder auto Op = DAG->getNode(ISD::EXTRACT_SUBVECTOR, Loc, VecVT, Vec, ZeroIdx); 193cab029f4SScott Linder auto DemandedElts = APInt(3, 7); 194cab029f4SScott Linder auto KnownUndef = APInt(3, 0); 195cab029f4SScott Linder auto KnownZero = APInt(3, 0); 196cab029f4SScott Linder TargetLowering::TargetLoweringOpt TLO(*DAG, false, false); 197cab029f4SScott Linder EXPECT_EQ(TL.SimplifyDemandedVectorElts(Op, DemandedElts, KnownUndef, 198cab029f4SScott Linder KnownZero, TLO), 199cab029f4SScott Linder false); 200cab029f4SScott Linder } 201cab029f4SScott Linder 2027edc7f6eSDavid Sherwood TEST_F(AArch64SelectionDAGTest, SimplifyDemandedBitsNEON) { 2037edc7f6eSDavid Sherwood TargetLowering TL(*TM); 2047edc7f6eSDavid Sherwood 2057edc7f6eSDavid Sherwood SDLoc Loc; 2067edc7f6eSDavid Sherwood auto Int8VT = EVT::getIntegerVT(Context, 8); 2077edc7f6eSDavid Sherwood auto InVecVT = EVT::getVectorVT(Context, Int8VT, 16); 2087edc7f6eSDavid Sherwood SDValue UnknownOp = DAG->getRegister(0, InVecVT); 2097edc7f6eSDavid Sherwood SDValue Mask1S = DAG->getConstant(0x8A, Loc, Int8VT); 2107edc7f6eSDavid Sherwood SDValue Mask1V = DAG->getSplatBuildVector(InVecVT, Loc, Mask1S); 2117edc7f6eSDavid Sherwood SDValue N0 = DAG->getNode(ISD::AND, Loc, InVecVT, Mask1V, UnknownOp); 2127edc7f6eSDavid Sherwood 2137edc7f6eSDavid Sherwood SDValue Mask2S = DAG->getConstant(0x55, Loc, Int8VT); 2147edc7f6eSDavid Sherwood SDValue Mask2V = DAG->getSplatBuildVector(InVecVT, Loc, Mask2S); 2157edc7f6eSDavid Sherwood 2167edc7f6eSDavid Sherwood SDValue Op = DAG->getNode(ISD::AND, Loc, InVecVT, N0, Mask2V); 2177edc7f6eSDavid Sherwood // N0 = ?000?0?0 2187edc7f6eSDavid Sherwood // Mask2V = 01010101 2197edc7f6eSDavid Sherwood // => 2207edc7f6eSDavid Sherwood // Known.Zero = 00100000 (0xAA) 2217edc7f6eSDavid Sherwood KnownBits Known; 2227edc7f6eSDavid Sherwood APInt DemandedBits = APInt(8, 0xFF); 2237edc7f6eSDavid Sherwood TargetLowering::TargetLoweringOpt TLO(*DAG, false, false); 2247edc7f6eSDavid Sherwood EXPECT_TRUE(TL.SimplifyDemandedBits(Op, DemandedBits, Known, TLO)); 2257edc7f6eSDavid Sherwood EXPECT_EQ(Known.Zero, APInt(8, 0xAA)); 2267edc7f6eSDavid Sherwood } 2277edc7f6eSDavid Sherwood 2287edc7f6eSDavid Sherwood TEST_F(AArch64SelectionDAGTest, SimplifyDemandedBitsSVE) { 2297edc7f6eSDavid Sherwood TargetLowering TL(*TM); 2307edc7f6eSDavid Sherwood 2317edc7f6eSDavid Sherwood SDLoc Loc; 2327edc7f6eSDavid Sherwood auto Int8VT = EVT::getIntegerVT(Context, 8); 2337edc7f6eSDavid Sherwood auto InVecVT = EVT::getVectorVT(Context, Int8VT, 16, /*IsScalable=*/true); 2347edc7f6eSDavid Sherwood SDValue UnknownOp = DAG->getRegister(0, InVecVT); 2357edc7f6eSDavid Sherwood SDValue Mask1S = DAG->getConstant(0x8A, Loc, Int8VT); 2367edc7f6eSDavid Sherwood SDValue Mask1V = DAG->getSplatVector(InVecVT, Loc, Mask1S); 2377edc7f6eSDavid Sherwood SDValue N0 = DAG->getNode(ISD::AND, Loc, InVecVT, Mask1V, UnknownOp); 2387edc7f6eSDavid Sherwood 2397edc7f6eSDavid Sherwood SDValue Mask2S = DAG->getConstant(0x55, Loc, Int8VT); 2407edc7f6eSDavid Sherwood SDValue Mask2V = DAG->getSplatVector(InVecVT, Loc, Mask2S); 2417edc7f6eSDavid Sherwood 2427edc7f6eSDavid Sherwood SDValue Op = DAG->getNode(ISD::AND, Loc, InVecVT, N0, Mask2V); 2437edc7f6eSDavid Sherwood 244186c1922SPhilip Reames // N0 = ?000?0?0 245186c1922SPhilip Reames // Mask2V = 01010101 246186c1922SPhilip Reames // => 247186c1922SPhilip Reames // Known.Zero = 00100000 (0xAA) 2487edc7f6eSDavid Sherwood KnownBits Known; 2497edc7f6eSDavid Sherwood APInt DemandedBits = APInt(8, 0xFF); 2507edc7f6eSDavid Sherwood TargetLowering::TargetLoweringOpt TLO(*DAG, false, false); 251186c1922SPhilip Reames EXPECT_TRUE(TL.SimplifyDemandedBits(Op, DemandedBits, Known, TLO)); 252186c1922SPhilip Reames EXPECT_EQ(Known.Zero, APInt(8, 0xAA)); 2537edc7f6eSDavid Sherwood } 2547edc7f6eSDavid Sherwood 25560569363SBjorn Pettersson // Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits. 25660569363SBjorn Pettersson TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_ADD) { 25760569363SBjorn Pettersson SDLoc Loc; 25860569363SBjorn Pettersson auto IntVT = EVT::getIntegerVT(Context, 8); 25960569363SBjorn Pettersson auto UnknownOp = DAG->getRegister(0, IntVT); 26060569363SBjorn Pettersson auto Mask = DAG->getConstant(0x8A, Loc, IntVT); 26160569363SBjorn Pettersson auto N0 = DAG->getNode(ISD::AND, Loc, IntVT, Mask, UnknownOp); 26260569363SBjorn Pettersson auto N1 = DAG->getConstant(0x55, Loc, IntVT); 26360569363SBjorn Pettersson auto Op = DAG->getNode(ISD::ADD, Loc, IntVT, N0, N1); 26460569363SBjorn Pettersson // N0 = ?000?0?0 26560569363SBjorn Pettersson // N1 = 01010101 26660569363SBjorn Pettersson // => 26760569363SBjorn Pettersson // Known.One = 01010101 (0x55) 26860569363SBjorn Pettersson // Known.Zero = 00100000 (0x20) 26960569363SBjorn Pettersson KnownBits Known = DAG->computeKnownBits(Op); 27060569363SBjorn Pettersson EXPECT_EQ(Known.Zero, APInt(8, 0x20)); 27160569363SBjorn Pettersson EXPECT_EQ(Known.One, APInt(8, 0x55)); 27260569363SBjorn Pettersson } 27360569363SBjorn Pettersson 27460569363SBjorn Pettersson // Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits. 275730df5a4SChristian Kissig TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_UADDO_CARRY) { 276730df5a4SChristian Kissig SDLoc Loc; 277730df5a4SChristian Kissig auto IntVT = EVT::getIntegerVT(Context, 8); 278730df5a4SChristian Kissig auto UnknownOp = DAG->getRegister(0, IntVT); 279730df5a4SChristian Kissig auto Mask_Zero = DAG->getConstant(0x28, Loc, IntVT); 280730df5a4SChristian Kissig auto Mask_One = DAG->getConstant(0x20, Loc, IntVT); 281730df5a4SChristian Kissig auto N0 = DAG->getNode(ISD::AND, Loc, IntVT, Mask_Zero, UnknownOp); 282730df5a4SChristian Kissig N0 = DAG->getNode(ISD::OR, Loc, IntVT, Mask_One, N0); 283730df5a4SChristian Kissig auto N1 = DAG->getConstant(0x65, Loc, IntVT); 284730df5a4SChristian Kissig 285730df5a4SChristian Kissig KnownBits Known; 286730df5a4SChristian Kissig 287730df5a4SChristian Kissig auto UnknownBorrow = DAG->getRegister(1, IntVT); 288730df5a4SChristian Kissig auto OpUnknownBorrow = 289730df5a4SChristian Kissig DAG->getNode(ISD::UADDO_CARRY, Loc, IntVT, N0, N1, UnknownBorrow); 290730df5a4SChristian Kissig // N0 = 0010?000 291730df5a4SChristian Kissig // N1 = 01100101 292730df5a4SChristian Kissig // B = ? 293730df5a4SChristian Kissig // => 294730df5a4SChristian Kissig // Known.Zero = 01110000 (0x70) 295730df5a4SChristian Kissig // Known.One = 10000100 (0x84) 296730df5a4SChristian Kissig Known = DAG->computeKnownBits(OpUnknownBorrow); 297730df5a4SChristian Kissig EXPECT_EQ(Known.Zero, APInt(8, 0x70)); 298730df5a4SChristian Kissig EXPECT_EQ(Known.One, APInt(8, 0x84)); 299730df5a4SChristian Kissig 300730df5a4SChristian Kissig auto ZeroBorrow = DAG->getConstant(0x0, Loc, IntVT); 301730df5a4SChristian Kissig auto OpZeroBorrow = 302730df5a4SChristian Kissig DAG->getNode(ISD::UADDO_CARRY, Loc, IntVT, N0, N1, ZeroBorrow); 303730df5a4SChristian Kissig // N0 = 0010?000 304730df5a4SChristian Kissig // N1 = 01100101 305730df5a4SChristian Kissig // B = 0 306730df5a4SChristian Kissig // => 307730df5a4SChristian Kissig // Known.Zero = 01110010 (0x72) 308730df5a4SChristian Kissig // Known.One = 10000101 (0x85) 309730df5a4SChristian Kissig Known = DAG->computeKnownBits(OpZeroBorrow); 310730df5a4SChristian Kissig EXPECT_EQ(Known.Zero, APInt(8, 0x72)); 311730df5a4SChristian Kissig EXPECT_EQ(Known.One, APInt(8, 0x85)); 312730df5a4SChristian Kissig 313730df5a4SChristian Kissig auto OneBorrow = DAG->getConstant(0x1, Loc, IntVT); 314730df5a4SChristian Kissig auto OpOneBorrow = 315730df5a4SChristian Kissig DAG->getNode(ISD::UADDO_CARRY, Loc, IntVT, N0, N1, OneBorrow); 316730df5a4SChristian Kissig // N0 = 0010?000 317730df5a4SChristian Kissig // N1 = 01100101 318730df5a4SChristian Kissig // B = 1 319730df5a4SChristian Kissig // => 320730df5a4SChristian Kissig // Known.Zero = 01110001 (0x71) 321730df5a4SChristian Kissig // Known.One = 10000110 (0x86) 322730df5a4SChristian Kissig Known = DAG->computeKnownBits(OpOneBorrow); 323730df5a4SChristian Kissig EXPECT_EQ(Known.Zero, APInt(8, 0x71)); 324730df5a4SChristian Kissig EXPECT_EQ(Known.One, APInt(8, 0x86)); 325730df5a4SChristian Kissig } 326730df5a4SChristian Kissig 327730df5a4SChristian Kissig // Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits. 32860569363SBjorn Pettersson TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_SUB) { 32960569363SBjorn Pettersson SDLoc Loc; 33060569363SBjorn Pettersson auto IntVT = EVT::getIntegerVT(Context, 8); 33160569363SBjorn Pettersson auto N0 = DAG->getConstant(0x55, Loc, IntVT); 33260569363SBjorn Pettersson auto UnknownOp = DAG->getRegister(0, IntVT); 33360569363SBjorn Pettersson auto Mask = DAG->getConstant(0x2e, Loc, IntVT); 33460569363SBjorn Pettersson auto N1 = DAG->getNode(ISD::AND, Loc, IntVT, Mask, UnknownOp); 33560569363SBjorn Pettersson auto Op = DAG->getNode(ISD::SUB, Loc, IntVT, N0, N1); 33660569363SBjorn Pettersson // N0 = 01010101 33760569363SBjorn Pettersson // N1 = 00?0???0 33860569363SBjorn Pettersson // => 33960569363SBjorn Pettersson // Known.One = 00000001 (0x1) 34060569363SBjorn Pettersson // Known.Zero = 10000000 (0x80) 34160569363SBjorn Pettersson KnownBits Known = DAG->computeKnownBits(Op); 34260569363SBjorn Pettersson EXPECT_EQ(Known.Zero, APInt(8, 0x80)); 34360569363SBjorn Pettersson EXPECT_EQ(Known.One, APInt(8, 0x1)); 34460569363SBjorn Pettersson } 34560569363SBjorn Pettersson 346730df5a4SChristian Kissig // Piggy-backing on the AArch64 tests to verify SelectionDAG::computeKnownBits. 347730df5a4SChristian Kissig TEST_F(AArch64SelectionDAGTest, ComputeKnownBits_USUBO_CARRY) { 348730df5a4SChristian Kissig SDLoc Loc; 349730df5a4SChristian Kissig auto IntVT = EVT::getIntegerVT(Context, 8); 350730df5a4SChristian Kissig auto N0 = DAG->getConstant(0x5a, Loc, IntVT); 351730df5a4SChristian Kissig auto UnknownOp = DAG->getRegister(0, IntVT); // ???????? 352730df5a4SChristian Kissig auto Mask1_Zero = DAG->getConstant(0x8, Loc, IntVT); // 00001000 353730df5a4SChristian Kissig auto Mask1_One = DAG->getConstant(0x20, Loc, IntVT); // 00100000 354730df5a4SChristian Kissig // N1 = (???????? & 00001000) | 00100000 = 0010?000 355730df5a4SChristian Kissig auto N1 = DAG->getNode(ISD::AND, Loc, IntVT, Mask1_Zero, UnknownOp); 356730df5a4SChristian Kissig N1 = DAG->getNode(ISD::OR, Loc, IntVT, Mask1_One, N1); 357730df5a4SChristian Kissig 358730df5a4SChristian Kissig KnownBits Known; 359730df5a4SChristian Kissig 360730df5a4SChristian Kissig auto UnknownBorrow = DAG->getRegister(1, IntVT); 361730df5a4SChristian Kissig auto OpUnknownBorrow = 362730df5a4SChristian Kissig DAG->getNode(ISD::USUBO_CARRY, Loc, IntVT, N0, N1, UnknownBorrow); 363730df5a4SChristian Kissig // N0 = 01011010 364730df5a4SChristian Kissig // N1 = 0010?000 365730df5a4SChristian Kissig // B = ? 366730df5a4SChristian Kissig // => 367730df5a4SChristian Kissig // Known.Zero = 11000100 (0xc4) 368730df5a4SChristian Kissig // Known.One = 00110000 (0x30) 369730df5a4SChristian Kissig Known = DAG->computeKnownBits(OpUnknownBorrow); 370730df5a4SChristian Kissig EXPECT_EQ(Known.Zero, APInt(8, 0xc4)); 371730df5a4SChristian Kissig EXPECT_EQ(Known.One, APInt(8, 0x30)); 372730df5a4SChristian Kissig 373730df5a4SChristian Kissig auto ZeroBorrow = DAG->getConstant(0x0, Loc, IntVT); 374730df5a4SChristian Kissig auto OpZeroBorrow = 375730df5a4SChristian Kissig DAG->getNode(ISD::USUBO_CARRY, Loc, IntVT, N0, N1, ZeroBorrow); 376730df5a4SChristian Kissig // N0 = 01011010 377730df5a4SChristian Kissig // N1 = 0010?000 378730df5a4SChristian Kissig // B = 0 379730df5a4SChristian Kissig // => 380730df5a4SChristian Kissig // Known.Zero = 11000101 (0xc5) 381730df5a4SChristian Kissig // Known.One = 00110010 (0x32) 382730df5a4SChristian Kissig Known = DAG->computeKnownBits(OpZeroBorrow); 383730df5a4SChristian Kissig EXPECT_EQ(Known.Zero, APInt(8, 0xc5)); 384730df5a4SChristian Kissig EXPECT_EQ(Known.One, APInt(8, 0x32)); 385730df5a4SChristian Kissig 386730df5a4SChristian Kissig auto OneBorrow = DAG->getConstant(0x1, Loc, IntVT); 387730df5a4SChristian Kissig auto OpOneBorrow = 388730df5a4SChristian Kissig DAG->getNode(ISD::USUBO_CARRY, Loc, IntVT, N0, N1, OneBorrow); 389730df5a4SChristian Kissig // N0 = 01011010 390730df5a4SChristian Kissig // N1 = 0010?000 391730df5a4SChristian Kissig // B = 1 392730df5a4SChristian Kissig // => 393730df5a4SChristian Kissig // Known.Zero = 11000110 (0xc6) 394730df5a4SChristian Kissig // Known.One = 00110001 (0x31) 395730df5a4SChristian Kissig Known = DAG->computeKnownBits(OpOneBorrow); 396730df5a4SChristian Kissig EXPECT_EQ(Known.Zero, APInt(8, 0xc6)); 397730df5a4SChristian Kissig EXPECT_EQ(Known.One, APInt(8, 0x31)); 398730df5a4SChristian Kissig } 399730df5a4SChristian Kissig 400cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, isSplatValue_Fixed_BUILD_VECTOR) { 401cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 402cd3a54c5SDavid Sherwood 403cd3a54c5SDavid Sherwood SDLoc Loc; 404cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 405cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, false); 406cd3a54c5SDavid Sherwood // Create a BUILD_VECTOR 407cd3a54c5SDavid Sherwood SDValue Op = DAG->getConstant(1, Loc, VecVT); 408cd3a54c5SDavid Sherwood EXPECT_EQ(Op->getOpcode(), ISD::BUILD_VECTOR); 409cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, /*AllowUndefs=*/false)); 410cd3a54c5SDavid Sherwood 411cd3a54c5SDavid Sherwood APInt UndefElts; 412cd3a54c5SDavid Sherwood APInt DemandedElts; 413cd3a54c5SDavid Sherwood EXPECT_FALSE(DAG->isSplatValue(Op, DemandedElts, UndefElts)); 414cd3a54c5SDavid Sherwood 415cd3a54c5SDavid Sherwood // Width=16, Mask=3 416cd3a54c5SDavid Sherwood DemandedElts = APInt(16, 3); 417cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, DemandedElts, UndefElts)); 418cd3a54c5SDavid Sherwood } 419cd3a54c5SDavid Sherwood 420cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, isSplatValue_Fixed_ADD_of_BUILD_VECTOR) { 421cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 422cd3a54c5SDavid Sherwood 423cd3a54c5SDavid Sherwood SDLoc Loc; 424cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 425cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, false); 426cd3a54c5SDavid Sherwood 427cd3a54c5SDavid Sherwood // Should create BUILD_VECTORs 428cd3a54c5SDavid Sherwood SDValue Val1 = DAG->getConstant(1, Loc, VecVT); 429cd3a54c5SDavid Sherwood SDValue Val2 = DAG->getConstant(3, Loc, VecVT); 430cd3a54c5SDavid Sherwood EXPECT_EQ(Val1->getOpcode(), ISD::BUILD_VECTOR); 431cd3a54c5SDavid Sherwood SDValue Op = DAG->getNode(ISD::ADD, Loc, VecVT, Val1, Val2); 432cd3a54c5SDavid Sherwood 433cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, /*AllowUndefs=*/false)); 434cd3a54c5SDavid Sherwood 435cd3a54c5SDavid Sherwood APInt UndefElts; 436cd3a54c5SDavid Sherwood APInt DemandedElts; 437cd3a54c5SDavid Sherwood EXPECT_FALSE(DAG->isSplatValue(Op, DemandedElts, UndefElts)); 438cd3a54c5SDavid Sherwood 439cd3a54c5SDavid Sherwood // Width=16, Mask=3 440cd3a54c5SDavid Sherwood DemandedElts = APInt(16, 3); 441cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, DemandedElts, UndefElts)); 442cd3a54c5SDavid Sherwood } 443cd3a54c5SDavid Sherwood 444cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, isSplatValue_Scalable_SPLAT_VECTOR) { 445cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 446cd3a54c5SDavid Sherwood 447cd3a54c5SDavid Sherwood SDLoc Loc; 448cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 449cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, true); 450cd3a54c5SDavid Sherwood // Create a SPLAT_VECTOR 451cd3a54c5SDavid Sherwood SDValue Op = DAG->getConstant(1, Loc, VecVT); 452cd3a54c5SDavid Sherwood EXPECT_EQ(Op->getOpcode(), ISD::SPLAT_VECTOR); 453cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, /*AllowUndefs=*/false)); 454cd3a54c5SDavid Sherwood 455cd3a54c5SDavid Sherwood APInt UndefElts; 456487695e7SPhilip Reames APInt DemandedElts(1,1); 457cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, DemandedElts, UndefElts)); 458cd3a54c5SDavid Sherwood } 459cd3a54c5SDavid Sherwood 460cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, isSplatValue_Scalable_ADD_of_SPLAT_VECTOR) { 461cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 462cd3a54c5SDavid Sherwood 463cd3a54c5SDavid Sherwood SDLoc Loc; 464cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 465cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, true); 466cd3a54c5SDavid Sherwood 467cd3a54c5SDavid Sherwood // Should create SPLAT_VECTORS 468cd3a54c5SDavid Sherwood SDValue Val1 = DAG->getConstant(1, Loc, VecVT); 469cd3a54c5SDavid Sherwood SDValue Val2 = DAG->getConstant(3, Loc, VecVT); 470cd3a54c5SDavid Sherwood EXPECT_EQ(Val1->getOpcode(), ISD::SPLAT_VECTOR); 471cd3a54c5SDavid Sherwood SDValue Op = DAG->getNode(ISD::ADD, Loc, VecVT, Val1, Val2); 472cd3a54c5SDavid Sherwood 473cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, /*AllowUndefs=*/false)); 474cd3a54c5SDavid Sherwood 475cd3a54c5SDavid Sherwood APInt UndefElts; 476487695e7SPhilip Reames APInt DemandedElts(1, 1); 477cd3a54c5SDavid Sherwood EXPECT_TRUE(DAG->isSplatValue(Op, DemandedElts, UndefElts)); 478cd3a54c5SDavid Sherwood } 479cd3a54c5SDavid Sherwood 480cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, getSplatSourceVector_Fixed_BUILD_VECTOR) { 481cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 482cd3a54c5SDavid Sherwood 483cd3a54c5SDavid Sherwood SDLoc Loc; 484cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 485cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, false); 486cd3a54c5SDavid Sherwood // Create a BUILD_VECTOR 487cd3a54c5SDavid Sherwood SDValue Op = DAG->getConstant(1, Loc, VecVT); 488cd3a54c5SDavid Sherwood EXPECT_EQ(Op->getOpcode(), ISD::BUILD_VECTOR); 489cd3a54c5SDavid Sherwood 490cd3a54c5SDavid Sherwood int SplatIdx = -1; 491cd3a54c5SDavid Sherwood EXPECT_EQ(DAG->getSplatSourceVector(Op, SplatIdx), Op); 492cd3a54c5SDavid Sherwood EXPECT_EQ(SplatIdx, 0); 493cd3a54c5SDavid Sherwood } 494cd3a54c5SDavid Sherwood 495cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, getSplatSourceVector_Fixed_ADD_of_BUILD_VECTOR) { 496cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 497cd3a54c5SDavid Sherwood 498cd3a54c5SDavid Sherwood SDLoc Loc; 499cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 500cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, false); 501cd3a54c5SDavid Sherwood 502cd3a54c5SDavid Sherwood // Should create BUILD_VECTORs 503cd3a54c5SDavid Sherwood SDValue Val1 = DAG->getConstant(1, Loc, VecVT); 504cd3a54c5SDavid Sherwood SDValue Val2 = DAG->getConstant(3, Loc, VecVT); 505cd3a54c5SDavid Sherwood EXPECT_EQ(Val1->getOpcode(), ISD::BUILD_VECTOR); 506cd3a54c5SDavid Sherwood SDValue Op = DAG->getNode(ISD::ADD, Loc, VecVT, Val1, Val2); 507cd3a54c5SDavid Sherwood 508cd3a54c5SDavid Sherwood int SplatIdx = -1; 509cd3a54c5SDavid Sherwood EXPECT_EQ(DAG->getSplatSourceVector(Op, SplatIdx), Op); 510cd3a54c5SDavid Sherwood EXPECT_EQ(SplatIdx, 0); 511cd3a54c5SDavid Sherwood } 512cd3a54c5SDavid Sherwood 513cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, getSplatSourceVector_Scalable_SPLAT_VECTOR) { 514cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 515cd3a54c5SDavid Sherwood 516cd3a54c5SDavid Sherwood SDLoc Loc; 517cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 518cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, true); 519cd3a54c5SDavid Sherwood // Create a SPLAT_VECTOR 520cd3a54c5SDavid Sherwood SDValue Op = DAG->getConstant(1, Loc, VecVT); 521cd3a54c5SDavid Sherwood EXPECT_EQ(Op->getOpcode(), ISD::SPLAT_VECTOR); 522cd3a54c5SDavid Sherwood 523cd3a54c5SDavid Sherwood int SplatIdx = -1; 524cd3a54c5SDavid Sherwood EXPECT_EQ(DAG->getSplatSourceVector(Op, SplatIdx), Op); 525cd3a54c5SDavid Sherwood EXPECT_EQ(SplatIdx, 0); 526cd3a54c5SDavid Sherwood } 527cd3a54c5SDavid Sherwood 528cd3a54c5SDavid Sherwood TEST_F(AArch64SelectionDAGTest, getSplatSourceVector_Scalable_ADD_of_SPLAT_VECTOR) { 529cd3a54c5SDavid Sherwood TargetLowering TL(*TM); 530cd3a54c5SDavid Sherwood 531cd3a54c5SDavid Sherwood SDLoc Loc; 532cd3a54c5SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 533cd3a54c5SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, IntVT, 16, true); 534cd3a54c5SDavid Sherwood 535cd3a54c5SDavid Sherwood // Should create SPLAT_VECTORS 536cd3a54c5SDavid Sherwood SDValue Val1 = DAG->getConstant(1, Loc, VecVT); 537cd3a54c5SDavid Sherwood SDValue Val2 = DAG->getConstant(3, Loc, VecVT); 538cd3a54c5SDavid Sherwood EXPECT_EQ(Val1->getOpcode(), ISD::SPLAT_VECTOR); 539cd3a54c5SDavid Sherwood SDValue Op = DAG->getNode(ISD::ADD, Loc, VecVT, Val1, Val2); 540cd3a54c5SDavid Sherwood 541cd3a54c5SDavid Sherwood int SplatIdx = -1; 542cd3a54c5SDavid Sherwood EXPECT_EQ(DAG->getSplatSourceVector(Op, SplatIdx), Op); 543cd3a54c5SDavid Sherwood EXPECT_EQ(SplatIdx, 0); 544cd3a54c5SDavid Sherwood } 545cd3a54c5SDavid Sherwood 546ce356e15SSimon Pilgrim TEST_F(AArch64SelectionDAGTest, getRepeatedSequence_Patterns) { 547ce356e15SSimon Pilgrim TargetLowering TL(*TM); 548ce356e15SSimon Pilgrim 549ce356e15SSimon Pilgrim SDLoc Loc; 550ce356e15SSimon Pilgrim unsigned NumElts = 16; 551ce356e15SSimon Pilgrim MVT IntVT = MVT::i8; 552ce356e15SSimon Pilgrim MVT VecVT = MVT::getVectorVT(IntVT, NumElts); 553ce356e15SSimon Pilgrim 554ce356e15SSimon Pilgrim // Base scalar constants. 555ce356e15SSimon Pilgrim SDValue Val0 = DAG->getConstant(0, Loc, IntVT); 556ce356e15SSimon Pilgrim SDValue Val1 = DAG->getConstant(1, Loc, IntVT); 557ce356e15SSimon Pilgrim SDValue Val2 = DAG->getConstant(2, Loc, IntVT); 558ce356e15SSimon Pilgrim SDValue Val3 = DAG->getConstant(3, Loc, IntVT); 559ce356e15SSimon Pilgrim SDValue UndefVal = DAG->getUNDEF(IntVT); 560ce356e15SSimon Pilgrim 561ce356e15SSimon Pilgrim // Build some repeating sequences. 562ce356e15SSimon Pilgrim SmallVector<SDValue, 16> Pattern1111, Pattern1133, Pattern0123; 563ce356e15SSimon Pilgrim for(int I = 0; I != 4; ++I) { 564ce356e15SSimon Pilgrim Pattern1111.append(4, Val1); 565ce356e15SSimon Pilgrim Pattern1133.append(2, Val1); 566ce356e15SSimon Pilgrim Pattern1133.append(2, Val3); 567ce356e15SSimon Pilgrim Pattern0123.push_back(Val0); 568ce356e15SSimon Pilgrim Pattern0123.push_back(Val1); 569ce356e15SSimon Pilgrim Pattern0123.push_back(Val2); 570ce356e15SSimon Pilgrim Pattern0123.push_back(Val3); 571ce356e15SSimon Pilgrim } 572ce356e15SSimon Pilgrim 573ce356e15SSimon Pilgrim // Build a non-pow2 repeating sequence. 574ce356e15SSimon Pilgrim SmallVector<SDValue, 16> Pattern022; 575ce356e15SSimon Pilgrim Pattern022.push_back(Val0); 576ce356e15SSimon Pilgrim Pattern022.append(2, Val2); 577ce356e15SSimon Pilgrim Pattern022.push_back(Val0); 578ce356e15SSimon Pilgrim Pattern022.append(2, Val2); 579ce356e15SSimon Pilgrim Pattern022.push_back(Val0); 580ce356e15SSimon Pilgrim Pattern022.append(2, Val2); 581ce356e15SSimon Pilgrim Pattern022.push_back(Val0); 582ce356e15SSimon Pilgrim Pattern022.append(2, Val2); 583ce356e15SSimon Pilgrim Pattern022.push_back(Val0); 584ce356e15SSimon Pilgrim Pattern022.append(2, Val2); 585ce356e15SSimon Pilgrim Pattern022.push_back(Val0); 586ce356e15SSimon Pilgrim 587ce356e15SSimon Pilgrim // Build a non-repeating sequence. 588ce356e15SSimon Pilgrim SmallVector<SDValue, 16> Pattern1_3; 589ce356e15SSimon Pilgrim Pattern1_3.append(8, Val1); 590ce356e15SSimon Pilgrim Pattern1_3.append(8, Val3); 591ce356e15SSimon Pilgrim 592ce356e15SSimon Pilgrim // Add some undefs to make it trickier. 593ce356e15SSimon Pilgrim Pattern1111[1] = Pattern1111[2] = Pattern1111[15] = UndefVal; 594ce356e15SSimon Pilgrim Pattern1133[0] = Pattern1133[2] = UndefVal; 595ce356e15SSimon Pilgrim 596ce356e15SSimon Pilgrim auto *BV1111 = 597ce356e15SSimon Pilgrim cast<BuildVectorSDNode>(DAG->getBuildVector(VecVT, Loc, Pattern1111)); 598ce356e15SSimon Pilgrim auto *BV1133 = 599ce356e15SSimon Pilgrim cast<BuildVectorSDNode>(DAG->getBuildVector(VecVT, Loc, Pattern1133)); 600ce356e15SSimon Pilgrim auto *BV0123= 601ce356e15SSimon Pilgrim cast<BuildVectorSDNode>(DAG->getBuildVector(VecVT, Loc, Pattern0123)); 602ce356e15SSimon Pilgrim auto *BV022 = 603ce356e15SSimon Pilgrim cast<BuildVectorSDNode>(DAG->getBuildVector(VecVT, Loc, Pattern022)); 604ce356e15SSimon Pilgrim auto *BV1_3 = 605ce356e15SSimon Pilgrim cast<BuildVectorSDNode>(DAG->getBuildVector(VecVT, Loc, Pattern1_3)); 606ce356e15SSimon Pilgrim 607ce356e15SSimon Pilgrim // Check for sequences. 608ce356e15SSimon Pilgrim SmallVector<SDValue, 16> Seq1111, Seq1133, Seq0123, Seq022, Seq1_3; 609ce356e15SSimon Pilgrim BitVector Undefs1111, Undefs1133, Undefs0123, Undefs022, Undefs1_3; 610ce356e15SSimon Pilgrim 611ce356e15SSimon Pilgrim EXPECT_TRUE(BV1111->getRepeatedSequence(Seq1111, &Undefs1111)); 612b481e00bSSimon Pilgrim EXPECT_EQ(Undefs1111.count(), 3u); 613b481e00bSSimon Pilgrim EXPECT_EQ(Seq1111.size(), 1u); 614ce356e15SSimon Pilgrim EXPECT_EQ(Seq1111[0], Val1); 615ce356e15SSimon Pilgrim 616ce356e15SSimon Pilgrim EXPECT_TRUE(BV1133->getRepeatedSequence(Seq1133, &Undefs1133)); 617b481e00bSSimon Pilgrim EXPECT_EQ(Undefs1133.count(), 2u); 618b481e00bSSimon Pilgrim EXPECT_EQ(Seq1133.size(), 4u); 619ce356e15SSimon Pilgrim EXPECT_EQ(Seq1133[0], Val1); 620ce356e15SSimon Pilgrim EXPECT_EQ(Seq1133[1], Val1); 621ce356e15SSimon Pilgrim EXPECT_EQ(Seq1133[2], Val3); 622ce356e15SSimon Pilgrim EXPECT_EQ(Seq1133[3], Val3); 623ce356e15SSimon Pilgrim 624ce356e15SSimon Pilgrim EXPECT_TRUE(BV0123->getRepeatedSequence(Seq0123, &Undefs0123)); 625b481e00bSSimon Pilgrim EXPECT_EQ(Undefs0123.count(), 0u); 626b481e00bSSimon Pilgrim EXPECT_EQ(Seq0123.size(), 4u); 627ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[0], Val0); 628ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[1], Val1); 629ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[2], Val2); 630ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[3], Val3); 631ce356e15SSimon Pilgrim 632ce356e15SSimon Pilgrim EXPECT_FALSE(BV022->getRepeatedSequence(Seq022, &Undefs022)); 633ce356e15SSimon Pilgrim EXPECT_FALSE(BV1_3->getRepeatedSequence(Seq1_3, &Undefs1_3)); 634ce356e15SSimon Pilgrim 635ce356e15SSimon Pilgrim // Try again with DemandedElts masks. 636ce356e15SSimon Pilgrim APInt Mask1111_0 = APInt::getOneBitSet(NumElts, 0); 637ce356e15SSimon Pilgrim EXPECT_TRUE(BV1111->getRepeatedSequence(Mask1111_0, Seq1111, &Undefs1111)); 638b481e00bSSimon Pilgrim EXPECT_EQ(Undefs1111.count(), 0u); 639b481e00bSSimon Pilgrim EXPECT_EQ(Seq1111.size(), 1u); 640ce356e15SSimon Pilgrim EXPECT_EQ(Seq1111[0], Val1); 641ce356e15SSimon Pilgrim 642ce356e15SSimon Pilgrim APInt Mask1111_1 = APInt::getOneBitSet(NumElts, 2); 643ce356e15SSimon Pilgrim EXPECT_TRUE(BV1111->getRepeatedSequence(Mask1111_1, Seq1111, &Undefs1111)); 644b481e00bSSimon Pilgrim EXPECT_EQ(Undefs1111.count(), 1u); 645b481e00bSSimon Pilgrim EXPECT_EQ(Seq1111.size(), 1u); 646ce356e15SSimon Pilgrim EXPECT_EQ(Seq1111[0], UndefVal); 647ce356e15SSimon Pilgrim 648ce356e15SSimon Pilgrim APInt Mask0123 = APInt(NumElts, 0x7777); 649ce356e15SSimon Pilgrim EXPECT_TRUE(BV0123->getRepeatedSequence(Mask0123, Seq0123, &Undefs0123)); 650b481e00bSSimon Pilgrim EXPECT_EQ(Undefs0123.count(), 0u); 651b481e00bSSimon Pilgrim EXPECT_EQ(Seq0123.size(), 4u); 652ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[0], Val0); 653ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[1], Val1); 654ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[2], Val2); 655ce356e15SSimon Pilgrim EXPECT_EQ(Seq0123[3], SDValue()); 656ce356e15SSimon Pilgrim 657ce356e15SSimon Pilgrim APInt Mask1_3 = APInt::getHighBitsSet(16, 8); 658ce356e15SSimon Pilgrim EXPECT_TRUE(BV1_3->getRepeatedSequence(Mask1_3, Seq1_3, &Undefs1_3)); 659b481e00bSSimon Pilgrim EXPECT_EQ(Undefs1_3.count(), 0u); 660b481e00bSSimon Pilgrim EXPECT_EQ(Seq1_3.size(), 1u); 661ce356e15SSimon Pilgrim EXPECT_EQ(Seq1_3[0], Val3); 662ce356e15SSimon Pilgrim } 663ce356e15SSimon Pilgrim 664937cb7a8SSander de Smalen TEST_F(AArch64SelectionDAGTest, getTypeConversion_SplitScalableMVT) { 665937cb7a8SSander de Smalen MVT VT = MVT::nxv4i64; 666937cb7a8SSander de Smalen EXPECT_EQ(getTypeAction(VT), TargetLoweringBase::TypeSplitVector); 667937cb7a8SSander de Smalen ASSERT_TRUE(getTypeToTransformTo(VT).isScalableVector()); 668937cb7a8SSander de Smalen } 669937cb7a8SSander de Smalen 670937cb7a8SSander de Smalen TEST_F(AArch64SelectionDAGTest, getTypeConversion_PromoteScalableMVT) { 671937cb7a8SSander de Smalen MVT VT = MVT::nxv2i32; 672937cb7a8SSander de Smalen EXPECT_EQ(getTypeAction(VT), TargetLoweringBase::TypePromoteInteger); 673937cb7a8SSander de Smalen ASSERT_TRUE(getTypeToTransformTo(VT).isScalableVector()); 674937cb7a8SSander de Smalen } 675937cb7a8SSander de Smalen 676937cb7a8SSander de Smalen TEST_F(AArch64SelectionDAGTest, getTypeConversion_NoScalarizeMVT_nxv1f32) { 677937cb7a8SSander de Smalen MVT VT = MVT::nxv1f32; 678937cb7a8SSander de Smalen EXPECT_NE(getTypeAction(VT), TargetLoweringBase::TypeScalarizeVector); 679937cb7a8SSander de Smalen ASSERT_TRUE(getTypeToTransformTo(VT).isScalableVector()); 680937cb7a8SSander de Smalen } 681937cb7a8SSander de Smalen 682937cb7a8SSander de Smalen TEST_F(AArch64SelectionDAGTest, getTypeConversion_SplitScalableEVT) { 683937cb7a8SSander de Smalen EVT VT = EVT::getVectorVT(Context, MVT::i64, 256, true); 684937cb7a8SSander de Smalen EXPECT_EQ(getTypeAction(VT), TargetLoweringBase::TypeSplitVector); 685937cb7a8SSander de Smalen EXPECT_EQ(getTypeToTransformTo(VT), VT.getHalfNumVectorElementsVT(Context)); 686937cb7a8SSander de Smalen } 687937cb7a8SSander de Smalen 688937cb7a8SSander de Smalen TEST_F(AArch64SelectionDAGTest, getTypeConversion_WidenScalableEVT) { 689937cb7a8SSander de Smalen EVT FromVT = EVT::getVectorVT(Context, MVT::i64, 6, true); 690937cb7a8SSander de Smalen EVT ToVT = EVT::getVectorVT(Context, MVT::i64, 8, true); 691937cb7a8SSander de Smalen 692937cb7a8SSander de Smalen EXPECT_EQ(getTypeAction(FromVT), TargetLoweringBase::TypeWidenVector); 693937cb7a8SSander de Smalen EXPECT_EQ(getTypeToTransformTo(FromVT), ToVT); 694937cb7a8SSander de Smalen } 695937cb7a8SSander de Smalen 6965db52751SKerry McLaughlin TEST_F(AArch64SelectionDAGTest, 6975db52751SKerry McLaughlin getTypeConversion_ScalarizeScalableEVT_nxv1f128) { 6985db52751SKerry McLaughlin EVT VT = EVT::getVectorVT(Context, MVT::f128, ElementCount::getScalable(1)); 6995db52751SKerry McLaughlin EXPECT_EQ(getTypeAction(VT), TargetLoweringBase::TypeScalarizeScalableVector); 7005db52751SKerry McLaughlin EXPECT_EQ(getTypeToTransformTo(VT), MVT::f128); 701937cb7a8SSander de Smalen } 702937cb7a8SSander de Smalen 703748ae528SDavid Sherwood TEST_F(AArch64SelectionDAGTest, TestFold_STEP_VECTOR) { 704748ae528SDavid Sherwood SDLoc Loc; 705748ae528SDavid Sherwood auto IntVT = EVT::getIntegerVT(Context, 8); 706748ae528SDavid Sherwood auto VecVT = EVT::getVectorVT(Context, MVT::i8, 16, true); 707748ae528SDavid Sherwood 708748ae528SDavid Sherwood // Should create SPLAT_VECTOR 709748ae528SDavid Sherwood SDValue Zero = DAG->getConstant(0, Loc, IntVT); 710748ae528SDavid Sherwood SDValue Op = DAG->getNode(ISD::STEP_VECTOR, Loc, VecVT, Zero); 711748ae528SDavid Sherwood EXPECT_EQ(Op.getOpcode(), ISD::SPLAT_VECTOR); 712748ae528SDavid Sherwood } 713748ae528SDavid Sherwood 7147d63983cSMarco Elver TEST_F(AArch64SelectionDAGTest, ReplaceAllUsesWith) { 7157d63983cSMarco Elver SDLoc Loc; 7167d63983cSMarco Elver EVT IntVT = EVT::getIntegerVT(Context, 8); 7177d63983cSMarco Elver 7187d63983cSMarco Elver SDValue N0 = DAG->getConstant(0x42, Loc, IntVT); 7197d63983cSMarco Elver SDValue N1 = DAG->getRegister(0, IntVT); 7207d63983cSMarco Elver // Construct node to fill arbitrary ExtraInfo. 7217d63983cSMarco Elver SDValue N2 = DAG->getNode(ISD::SUB, Loc, IntVT, N0, N1); 7227d63983cSMarco Elver EXPECT_FALSE(DAG->getHeapAllocSite(N2.getNode())); 7237d63983cSMarco Elver EXPECT_FALSE(DAG->getNoMergeSiteInfo(N2.getNode())); 7244c58b008SMarco Elver EXPECT_FALSE(DAG->getPCSections(N2.getNode())); 725eb6e7e8fSJay Foad MDNode *MD = MDNode::get(Context, {}); 7267d63983cSMarco Elver DAG->addHeapAllocSite(N2.getNode(), MD); 7277d63983cSMarco Elver DAG->addNoMergeSiteInfo(N2.getNode(), true); 7284c58b008SMarco Elver DAG->addPCSections(N2.getNode(), MD); 7297d63983cSMarco Elver EXPECT_EQ(DAG->getHeapAllocSite(N2.getNode()), MD); 7307d63983cSMarco Elver EXPECT_TRUE(DAG->getNoMergeSiteInfo(N2.getNode())); 7314c58b008SMarco Elver EXPECT_EQ(DAG->getPCSections(N2.getNode()), MD); 7327d63983cSMarco Elver 7337d63983cSMarco Elver SDValue Root = DAG->getNode(ISD::ADD, Loc, IntVT, N2, N2); 7347d63983cSMarco Elver EXPECT_EQ(Root->getOperand(0)->getOpcode(), ISD::SUB); 7357d63983cSMarco Elver // Create new node and check that ExtraInfo is propagated on RAUW. 7367d63983cSMarco Elver SDValue New = DAG->getNode(ISD::ADD, Loc, IntVT, N1, N1); 7377d63983cSMarco Elver EXPECT_FALSE(DAG->getHeapAllocSite(New.getNode())); 7387d63983cSMarco Elver EXPECT_FALSE(DAG->getNoMergeSiteInfo(New.getNode())); 7394c58b008SMarco Elver EXPECT_FALSE(DAG->getPCSections(New.getNode())); 7407d63983cSMarco Elver 7417d63983cSMarco Elver DAG->ReplaceAllUsesWith(N2, New); 7427d63983cSMarco Elver EXPECT_EQ(Root->getOperand(0), New); 7437d63983cSMarco Elver EXPECT_EQ(DAG->getHeapAllocSite(New.getNode()), MD); 7447d63983cSMarco Elver EXPECT_TRUE(DAG->getNoMergeSiteInfo(New.getNode())); 7454c58b008SMarco Elver EXPECT_EQ(DAG->getPCSections(New.getNode()), MD); 7467d63983cSMarco Elver } 7477d63983cSMarco Elver 748dbca8a49SDavid Green TEST_F(AArch64SelectionDAGTest, computeKnownBits_extload_known01) { 749dbca8a49SDavid Green SDLoc Loc; 750dbca8a49SDavid Green auto Int8VT = EVT::getIntegerVT(Context, 8); 751dbca8a49SDavid Green auto Int32VT = EVT::getIntegerVT(Context, 32); 752dbca8a49SDavid Green auto Int64VT = EVT::getIntegerVT(Context, 64); 753dbca8a49SDavid Green auto Ptr = DAG->getConstant(0, Loc, Int64VT); 754dbca8a49SDavid Green auto PtrInfo = 755dbca8a49SDavid Green MachinePointerInfo::getFixedStack(DAG->getMachineFunction(), 0); 756dbca8a49SDavid Green AAMDNodes AA; 757dbca8a49SDavid Green MDBuilder MDHelper(*DAG->getContext()); 758dbca8a49SDavid Green MDNode *Range = MDHelper.createRange(APInt(8, 0), APInt(8, 2)); 759dbca8a49SDavid Green MachineMemOperand *MMO = DAG->getMachineFunction().getMachineMemOperand( 760dbca8a49SDavid Green PtrInfo, MachineMemOperand::MOLoad, 8, Align(8), AA, Range); 761dbca8a49SDavid Green 762dbca8a49SDavid Green auto ALoad = DAG->getExtLoad(ISD::EXTLOAD, Loc, Int32VT, DAG->getEntryNode(), 763dbca8a49SDavid Green Ptr, Int8VT, MMO); 764dbca8a49SDavid Green KnownBits Known = DAG->computeKnownBits(ALoad); 765dbca8a49SDavid Green EXPECT_EQ(Known.Zero, APInt(32, 0xfe)); 766dbca8a49SDavid Green EXPECT_EQ(Known.One, APInt(32, 0)); 767dbca8a49SDavid Green 768dbca8a49SDavid Green auto ZLoad = DAG->getExtLoad(ISD::ZEXTLOAD, Loc, Int32VT, DAG->getEntryNode(), 769dbca8a49SDavid Green Ptr, Int8VT, MMO); 770dbca8a49SDavid Green Known = DAG->computeKnownBits(ZLoad); 771dbca8a49SDavid Green EXPECT_EQ(Known.Zero, APInt(32, 0xfffffffe)); 772dbca8a49SDavid Green EXPECT_EQ(Known.One, APInt(32, 0)); 773dbca8a49SDavid Green 774dbca8a49SDavid Green auto SLoad = DAG->getExtLoad(ISD::SEXTLOAD, Loc, Int32VT, DAG->getEntryNode(), 775dbca8a49SDavid Green Ptr, Int8VT, MMO); 776dbca8a49SDavid Green Known = DAG->computeKnownBits(SLoad); 777dbca8a49SDavid Green EXPECT_EQ(Known.Zero, APInt(32, 0xfffffffe)); 778dbca8a49SDavid Green EXPECT_EQ(Known.One, APInt(32, 0)); 779dbca8a49SDavid Green } 780dbca8a49SDavid Green 781dbca8a49SDavid Green TEST_F(AArch64SelectionDAGTest, computeKnownBits_extload_knownnegative) { 782dbca8a49SDavid Green SDLoc Loc; 783dbca8a49SDavid Green auto Int8VT = EVT::getIntegerVT(Context, 8); 784dbca8a49SDavid Green auto Int32VT = EVT::getIntegerVT(Context, 32); 785dbca8a49SDavid Green auto Int64VT = EVT::getIntegerVT(Context, 64); 786dbca8a49SDavid Green auto Ptr = DAG->getConstant(0, Loc, Int64VT); 787dbca8a49SDavid Green auto PtrInfo = 788dbca8a49SDavid Green MachinePointerInfo::getFixedStack(DAG->getMachineFunction(), 0); 789dbca8a49SDavid Green AAMDNodes AA; 790dbca8a49SDavid Green MDBuilder MDHelper(*DAG->getContext()); 791dbca8a49SDavid Green MDNode *Range = MDHelper.createRange(APInt(8, 0xf0), APInt(8, 0xff)); 792dbca8a49SDavid Green MachineMemOperand *MMO = DAG->getMachineFunction().getMachineMemOperand( 793dbca8a49SDavid Green PtrInfo, MachineMemOperand::MOLoad, 8, Align(8), AA, Range); 794dbca8a49SDavid Green 795dbca8a49SDavid Green auto ALoad = DAG->getExtLoad(ISD::EXTLOAD, Loc, Int32VT, DAG->getEntryNode(), 796dbca8a49SDavid Green Ptr, Int8VT, MMO); 797dbca8a49SDavid Green KnownBits Known = DAG->computeKnownBits(ALoad); 798dbca8a49SDavid Green EXPECT_EQ(Known.Zero, APInt(32, 0)); 799dbca8a49SDavid Green EXPECT_EQ(Known.One, APInt(32, 0xf0)); 800dbca8a49SDavid Green 801dbca8a49SDavid Green auto ZLoad = DAG->getExtLoad(ISD::ZEXTLOAD, Loc, Int32VT, DAG->getEntryNode(), 802dbca8a49SDavid Green Ptr, Int8VT, MMO); 803dbca8a49SDavid Green Known = DAG->computeKnownBits(ZLoad); 804dbca8a49SDavid Green EXPECT_EQ(Known.Zero, APInt(32, 0xffffff00)); 805dbca8a49SDavid Green EXPECT_EQ(Known.One, APInt(32, 0x000000f0)); 806dbca8a49SDavid Green 807dbca8a49SDavid Green auto SLoad = DAG->getExtLoad(ISD::SEXTLOAD, Loc, Int32VT, DAG->getEntryNode(), 808dbca8a49SDavid Green Ptr, Int8VT, MMO); 809dbca8a49SDavid Green Known = DAG->computeKnownBits(SLoad); 810dbca8a49SDavid Green EXPECT_EQ(Known.Zero, APInt(32, 0)); 811dbca8a49SDavid Green EXPECT_EQ(Known.One, APInt(32, 0xfffffff0)); 812dbca8a49SDavid Green } 813dbca8a49SDavid Green 81466542355SSizov Nikita TEST_F(AArch64SelectionDAGTest, 81566542355SSizov Nikita computeKnownBits_AVGFLOORU_AVGFLOORS_AVGCEILU_AVGCEILS) { 81666542355SSizov Nikita SDLoc Loc; 81766542355SSizov Nikita auto Int8VT = EVT::getIntegerVT(Context, 8); 81866542355SSizov Nikita auto Int16VT = EVT::getIntegerVT(Context, 16); 81966542355SSizov Nikita auto Int8Vec8VT = EVT::getVectorVT(Context, Int8VT, 8); 82066542355SSizov Nikita auto Int16Vec8VT = EVT::getVectorVT(Context, Int16VT, 8); 82166542355SSizov Nikita 82266542355SSizov Nikita SDValue UnknownOp0 = DAG->getRegister(0, Int8Vec8VT); 82366542355SSizov Nikita SDValue UnknownOp1 = DAG->getRegister(1, Int8Vec8VT); 82466542355SSizov Nikita 82566542355SSizov Nikita SDValue ZextOp0 = 82666542355SSizov Nikita DAG->getNode(ISD::ZERO_EXTEND, Loc, Int16Vec8VT, UnknownOp0); 82766542355SSizov Nikita SDValue ZextOp1 = 82866542355SSizov Nikita DAG->getNode(ISD::ZERO_EXTEND, Loc, Int16Vec8VT, UnknownOp1); 82966542355SSizov Nikita // ZextOp0 = 00000000???????? 83066542355SSizov Nikita // ZextOp1 = 00000000???????? 83166542355SSizov Nikita // => (for all AVG* instructions) 83266542355SSizov Nikita // Known.Zero = 1111111100000000 (0xFF00) 83366542355SSizov Nikita // Known.One = 0000000000000000 (0x0000) 83466542355SSizov Nikita auto Zeroes = APInt(16, 0xFF00); 83566542355SSizov Nikita auto Ones = APInt(16, 0x0000); 83666542355SSizov Nikita 83766542355SSizov Nikita SDValue AVGFLOORU = 83866542355SSizov Nikita DAG->getNode(ISD::AVGFLOORU, Loc, Int16Vec8VT, ZextOp0, ZextOp1); 83966542355SSizov Nikita KnownBits KnownAVGFLOORU = DAG->computeKnownBits(AVGFLOORU); 84066542355SSizov Nikita EXPECT_EQ(KnownAVGFLOORU.Zero, Zeroes); 84166542355SSizov Nikita EXPECT_EQ(KnownAVGFLOORU.One, Ones); 84266542355SSizov Nikita 84366542355SSizov Nikita SDValue AVGFLOORS = 8446acc50aeSSimon Pilgrim DAG->getNode(ISD::AVGFLOORS, Loc, Int16Vec8VT, ZextOp0, ZextOp1); 84566542355SSizov Nikita KnownBits KnownAVGFLOORS = DAG->computeKnownBits(AVGFLOORS); 84666542355SSizov Nikita EXPECT_EQ(KnownAVGFLOORS.Zero, Zeroes); 84766542355SSizov Nikita EXPECT_EQ(KnownAVGFLOORS.One, Ones); 84866542355SSizov Nikita 84966542355SSizov Nikita SDValue AVGCEILU = 85066542355SSizov Nikita DAG->getNode(ISD::AVGCEILU, Loc, Int16Vec8VT, ZextOp0, ZextOp1); 85166542355SSizov Nikita KnownBits KnownAVGCEILU = DAG->computeKnownBits(AVGCEILU); 85266542355SSizov Nikita EXPECT_EQ(KnownAVGCEILU.Zero, Zeroes); 85366542355SSizov Nikita EXPECT_EQ(KnownAVGCEILU.One, Ones); 85466542355SSizov Nikita 85566542355SSizov Nikita SDValue AVGCEILS = 85666542355SSizov Nikita DAG->getNode(ISD::AVGCEILS, Loc, Int16Vec8VT, ZextOp0, ZextOp1); 85766542355SSizov Nikita KnownBits KnownAVGCEILS = DAG->computeKnownBits(AVGCEILS); 85866542355SSizov Nikita EXPECT_EQ(KnownAVGCEILS.Zero, Zeroes); 85966542355SSizov Nikita EXPECT_EQ(KnownAVGCEILS.One, Ones); 86066542355SSizov Nikita } 86166542355SSizov Nikita 862937cb7a8SSander de Smalen } // end namespace llvm 863