xref: /llvm-project/llvm/unittests/CodeGen/AArch64SelectionDAGTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
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