xref: /llvm-project/llvm/unittests/CodeGen/SelectionDAGAddressAnalysisTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
18d06a678SHsiangkai Wang //===- llvm/unittest/CodeGen/SelectionDAGAddressAnalysisTest.cpp  ---------===//
28d06a678SHsiangkai Wang //
38d06a678SHsiangkai Wang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48d06a678SHsiangkai Wang // See https://llvm.org/LICENSE.txt for license information.
58d06a678SHsiangkai Wang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68d06a678SHsiangkai Wang //
78d06a678SHsiangkai Wang //===----------------------------------------------------------------------===//
88d06a678SHsiangkai Wang 
98d06a678SHsiangkai Wang #include "llvm/CodeGen/SelectionDAGAddressAnalysis.h"
108d06a678SHsiangkai Wang #include "llvm/Analysis/MemoryLocation.h"
118d06a678SHsiangkai Wang #include "llvm/Analysis/OptimizationRemarkEmitter.h"
128d06a678SHsiangkai Wang #include "llvm/AsmParser/Parser.h"
138d06a678SHsiangkai Wang #include "llvm/CodeGen/MachineModuleInfo.h"
148d06a678SHsiangkai Wang #include "llvm/CodeGen/SelectionDAG.h"
158d06a678SHsiangkai Wang #include "llvm/CodeGen/TargetLowering.h"
164169338eSNikita Popov #include "llvm/IR/Module.h"
1789b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
188d06a678SHsiangkai Wang #include "llvm/Support/SourceMgr.h"
198d06a678SHsiangkai Wang #include "llvm/Support/TargetSelect.h"
208d06a678SHsiangkai Wang #include "llvm/Target/TargetMachine.h"
218d06a678SHsiangkai Wang #include "gtest/gtest.h"
228d06a678SHsiangkai Wang 
238d06a678SHsiangkai Wang namespace llvm {
248d06a678SHsiangkai Wang 
258d06a678SHsiangkai Wang class SelectionDAGAddressAnalysisTest : public testing::Test {
268d06a678SHsiangkai Wang protected:
278d06a678SHsiangkai Wang   static void SetUpTestCase() {
288d06a678SHsiangkai Wang     InitializeAllTargets();
298d06a678SHsiangkai Wang     InitializeAllTargetMCs();
308d06a678SHsiangkai Wang   }
318d06a678SHsiangkai Wang 
328d06a678SHsiangkai Wang   void SetUp() override {
338d06a678SHsiangkai Wang     StringRef Assembly = "@g = global i32 0\n"
341896fb2cSBjorn Pettersson                          "@g_alias = alias i32, i32* @g\n"
358d06a678SHsiangkai Wang                          "define i32 @f() {\n"
368d06a678SHsiangkai Wang                          "  %1 = load i32, i32* @g\n"
378d06a678SHsiangkai Wang                          "  ret i32 %1\n"
388d06a678SHsiangkai Wang                          "}";
398d06a678SHsiangkai Wang 
408d06a678SHsiangkai Wang     Triple TargetTriple("aarch64--");
418d06a678SHsiangkai Wang     std::string Error;
428d06a678SHsiangkai Wang     const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
438d06a678SHsiangkai Wang     // FIXME: These tests do not depend on AArch64 specifically, but we have to
448d06a678SHsiangkai Wang     // initialize a target. A skeleton Target for unittests would allow us to
458d06a678SHsiangkai Wang     // always run these tests.
468d06a678SHsiangkai Wang     if (!T)
475bbf1feaSIgor Kudrin       GTEST_SKIP();
488d06a678SHsiangkai Wang 
498d06a678SHsiangkai Wang     TargetOptions Options;
50*bb3f5e1fSMatin Raayai     TM = std::unique_ptr<TargetMachine>(
51b6a01caaSKazu Hirata         T->createTargetMachine("AArch64", "", "+sve", Options, std::nullopt,
52*bb3f5e1fSMatin Raayai                                std::nullopt, CodeGenOptLevel::Aggressive));
538d06a678SHsiangkai Wang     if (!TM)
545bbf1feaSIgor Kudrin       GTEST_SKIP();
558d06a678SHsiangkai Wang 
568d06a678SHsiangkai Wang     SMDiagnostic SMError;
578d06a678SHsiangkai Wang     M = parseAssemblyString(Assembly, SMError, Context);
588d06a678SHsiangkai Wang     if (!M)
598d06a678SHsiangkai Wang       report_fatal_error(SMError.getMessage());
608d06a678SHsiangkai Wang     M->setDataLayout(TM->createDataLayout());
618d06a678SHsiangkai Wang 
628d06a678SHsiangkai Wang     F = M->getFunction("f");
638d06a678SHsiangkai Wang     if (!F)
648d06a678SHsiangkai Wang       report_fatal_error("F?");
658d06a678SHsiangkai Wang     G = M->getGlobalVariable("g");
668d06a678SHsiangkai Wang     if (!G)
678d06a678SHsiangkai Wang       report_fatal_error("G?");
681896fb2cSBjorn Pettersson     AliasedG = M->getNamedAlias("g_alias");
691896fb2cSBjorn Pettersson     if (!AliasedG)
701896fb2cSBjorn Pettersson       report_fatal_error("AliasedG?");
718d06a678SHsiangkai Wang 
728d06a678SHsiangkai Wang     MachineModuleInfo MMI(TM.get());
738d06a678SHsiangkai Wang 
748d06a678SHsiangkai Wang     MF = std::make_unique<MachineFunction>(*F, *TM, *TM->getSubtargetImpl(*F),
7563e16478SMatt Arsenault                                            MMI.getContext(), 0);
768d06a678SHsiangkai Wang 
770a1aa6cdSArthur Eubanks     DAG = std::make_unique<SelectionDAG>(*TM, CodeGenOptLevel::None);
788d06a678SHsiangkai Wang     if (!DAG)
798d06a678SHsiangkai Wang       report_fatal_error("DAG?");
808d06a678SHsiangkai Wang     OptimizationRemarkEmitter ORE(F);
81455990d1SVitaly Buka     DAG->init(*MF, ORE, nullptr, nullptr, nullptr, nullptr, nullptr, MMI,
82455990d1SVitaly Buka               nullptr);
838d06a678SHsiangkai Wang   }
848d06a678SHsiangkai Wang 
858d06a678SHsiangkai Wang   TargetLoweringBase::LegalizeTypeAction getTypeAction(EVT VT) {
868d06a678SHsiangkai Wang     return DAG->getTargetLoweringInfo().getTypeAction(Context, VT);
878d06a678SHsiangkai Wang   }
888d06a678SHsiangkai Wang 
898d06a678SHsiangkai Wang   EVT getTypeToTransformTo(EVT VT) {
908d06a678SHsiangkai Wang     return DAG->getTargetLoweringInfo().getTypeToTransformTo(Context, VT);
918d06a678SHsiangkai Wang   }
928d06a678SHsiangkai Wang 
938d06a678SHsiangkai Wang   LLVMContext Context;
94*bb3f5e1fSMatin Raayai   std::unique_ptr<TargetMachine> TM;
958d06a678SHsiangkai Wang   std::unique_ptr<Module> M;
968d06a678SHsiangkai Wang   Function *F;
978d06a678SHsiangkai Wang   GlobalVariable *G;
981896fb2cSBjorn Pettersson   GlobalAlias *AliasedG;
998d06a678SHsiangkai Wang   std::unique_ptr<MachineFunction> MF;
1008d06a678SHsiangkai Wang   std::unique_ptr<SelectionDAG> DAG;
1018d06a678SHsiangkai Wang };
1028d06a678SHsiangkai Wang 
1038d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, sameFrameObject) {
1048d06a678SHsiangkai Wang   SDLoc Loc;
1058d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
1068d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
1078d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1088d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1098d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
11081b7f115SSander de Smalen   TypeSize Offset = TypeSize::getFixed(0);
1118d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, VecVT);
1128d06a678SHsiangkai Wang   SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
1138d06a678SHsiangkai Wang   SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
1148d06a678SHsiangkai Wang                                 PtrInfo.getWithOffset(Offset));
1156e41d60aSDavid Green   TypeSize NumBytes = cast<StoreSDNode>(Store)->getMemoryVT().getStoreSize();
1168d06a678SHsiangkai Wang 
1178d06a678SHsiangkai Wang   bool IsAlias;
1188d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
1196e41d60aSDavid Green       Store.getNode(), LocationSize::precise(NumBytes), Store.getNode(),
1206e41d60aSDavid Green       LocationSize::precise(NumBytes), *DAG, IsAlias);
1218d06a678SHsiangkai Wang 
1228d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
1238d06a678SHsiangkai Wang   EXPECT_TRUE(IsAlias);
1248d06a678SHsiangkai Wang }
1258d06a678SHsiangkai Wang 
1268ed0e6b2SBjorn Pettersson TEST_F(SelectionDAGAddressAnalysisTest, sameFrameObjectUnknownSize) {
1278ed0e6b2SBjorn Pettersson   SDLoc Loc;
1288ed0e6b2SBjorn Pettersson   auto Int8VT = EVT::getIntegerVT(Context, 8);
1298ed0e6b2SBjorn Pettersson   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
1308ed0e6b2SBjorn Pettersson   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1318ed0e6b2SBjorn Pettersson   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1328ed0e6b2SBjorn Pettersson   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
13381b7f115SSander de Smalen   TypeSize Offset = TypeSize::getFixed(0);
1348ed0e6b2SBjorn Pettersson   SDValue Value = DAG->getConstant(0, Loc, VecVT);
1358ed0e6b2SBjorn Pettersson   SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
1368ed0e6b2SBjorn Pettersson   SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
1378ed0e6b2SBjorn Pettersson                                 PtrInfo.getWithOffset(Offset));
1388ed0e6b2SBjorn Pettersson 
1398ed0e6b2SBjorn Pettersson   bool IsAlias;
1408ed0e6b2SBjorn Pettersson   bool IsValid = BaseIndexOffset::computeAliasing(
1416e41d60aSDavid Green       Store.getNode(), LocationSize::beforeOrAfterPointer(), Store.getNode(),
1426e41d60aSDavid Green       LocationSize::beforeOrAfterPointer(), *DAG, IsAlias);
1438ed0e6b2SBjorn Pettersson 
1448ed0e6b2SBjorn Pettersson   EXPECT_FALSE(IsValid);
1458ed0e6b2SBjorn Pettersson }
1468ed0e6b2SBjorn Pettersson 
1478d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, noAliasingFrameObjects) {
1488d06a678SHsiangkai Wang   SDLoc Loc;
1498d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
1508d06a678SHsiangkai Wang   // <4 x i8>
1518d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
1528d06a678SHsiangkai Wang   // <2 x i8>
1538d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2);
1548d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1558d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1568d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
1578d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, SubVecVT);
15881b7f115SSander de Smalen   TypeSize Offset0 = TypeSize::getFixed(0);
1598d06a678SHsiangkai Wang   TypeSize Offset1 = SubVecVT.getStoreSize();
1608d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
1618d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
1628d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index0,
1638d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset0));
1648d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index1,
1658d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset1));
1666e41d60aSDavid Green   TypeSize NumBytes0 = cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize();
1676e41d60aSDavid Green   TypeSize NumBytes1 = cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize();
1688d06a678SHsiangkai Wang 
1698d06a678SHsiangkai Wang   bool IsAlias;
1708d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
1716e41d60aSDavid Green       Store0.getNode(), LocationSize::precise(NumBytes0), Store1.getNode(),
1726e41d60aSDavid Green       LocationSize::precise(NumBytes1), *DAG, IsAlias);
1738d06a678SHsiangkai Wang 
1748d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
1758d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
1768d06a678SHsiangkai Wang }
1778d06a678SHsiangkai Wang 
1788d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, unknownSizeFrameObjects) {
1798d06a678SHsiangkai Wang   SDLoc Loc;
1808d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
1818d06a678SHsiangkai Wang   // <vscale x 4 x i8>
1828d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
1838d06a678SHsiangkai Wang   // <vscale x 2 x i8>
1848d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
1858d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1868d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1878d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
1888d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, SubVecVT);
1898d06a678SHsiangkai Wang   TypeSize Offset1 = SubVecVT.getStoreSize();
1908d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
191305a0badSCraig Topper   SDValue Store0 =
192305a0badSCraig Topper       DAG->getStore(DAG->getEntryNode(), Loc, Value, FIPtr, PtrInfo);
1938d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index1,
194305a0badSCraig Topper                                  MachinePointerInfo(PtrInfo.getAddrSpace()));
1956e41d60aSDavid Green   TypeSize NumBytes0 = cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize();
1966e41d60aSDavid Green   TypeSize NumBytes1 = cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize();
1978d06a678SHsiangkai Wang 
1988d06a678SHsiangkai Wang   bool IsAlias;
1998d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
2006e41d60aSDavid Green       Store0.getNode(), LocationSize::precise(NumBytes0), Store1.getNode(),
2016e41d60aSDavid Green       LocationSize::precise(NumBytes1), *DAG, IsAlias);
2028d06a678SHsiangkai Wang 
2038d06a678SHsiangkai Wang   EXPECT_FALSE(IsValid);
2048d06a678SHsiangkai Wang }
2058d06a678SHsiangkai Wang 
2068d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, globalWithFrameObject) {
2078d06a678SHsiangkai Wang   SDLoc Loc;
2088d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
2098d06a678SHsiangkai Wang   // <vscale x 4 x i8>
2108d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
2118d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
2128d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
2138d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
2148d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, VecVT);
21581b7f115SSander de Smalen   TypeSize Offset = TypeSize::getFixed(0);
2168d06a678SHsiangkai Wang   SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
2178d06a678SHsiangkai Wang   SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
2188d06a678SHsiangkai Wang                                 PtrInfo.getWithOffset(Offset));
2196e41d60aSDavid Green   TypeSize NumBytes = cast<StoreSDNode>(Store)->getMemoryVT().getStoreSize();
2208d06a678SHsiangkai Wang   EVT GTy = DAG->getTargetLoweringInfo().getValueType(DAG->getDataLayout(),
2218d06a678SHsiangkai Wang                                                       G->getType());
2228d06a678SHsiangkai Wang   SDValue GValue = DAG->getConstant(0, Loc, GTy);
2238d06a678SHsiangkai Wang   SDValue GAddr = DAG->getGlobalAddress(G, Loc, GTy);
2248d06a678SHsiangkai Wang   SDValue GStore = DAG->getStore(DAG->getEntryNode(), Loc, GValue, GAddr,
2258d06a678SHsiangkai Wang                                  MachinePointerInfo(G, 0));
2266e41d60aSDavid Green   TypeSize GNumBytes = cast<StoreSDNode>(GStore)->getMemoryVT().getStoreSize();
2278d06a678SHsiangkai Wang 
2288d06a678SHsiangkai Wang   bool IsAlias;
2298d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
2306e41d60aSDavid Green       Store.getNode(), LocationSize::precise(NumBytes), GStore.getNode(),
2316e41d60aSDavid Green       LocationSize::precise(GNumBytes), *DAG, IsAlias);
2328d06a678SHsiangkai Wang 
2338d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
2348d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
2358d06a678SHsiangkai Wang }
2368d06a678SHsiangkai Wang 
2371896fb2cSBjorn Pettersson TEST_F(SelectionDAGAddressAnalysisTest, globalWithAliasedGlobal) {
2381896fb2cSBjorn Pettersson   SDLoc Loc;
2391896fb2cSBjorn Pettersson 
2401896fb2cSBjorn Pettersson   EVT GTy = DAG->getTargetLoweringInfo().getValueType(DAG->getDataLayout(),
2411896fb2cSBjorn Pettersson                                                       G->getType());
2421896fb2cSBjorn Pettersson   SDValue GValue = DAG->getConstant(0, Loc, GTy);
2431896fb2cSBjorn Pettersson   SDValue GAddr = DAG->getGlobalAddress(G, Loc, GTy);
2441896fb2cSBjorn Pettersson   SDValue GStore = DAG->getStore(DAG->getEntryNode(), Loc, GValue, GAddr,
2451896fb2cSBjorn Pettersson                                  MachinePointerInfo(G, 0));
2466e41d60aSDavid Green   TypeSize GNumBytes = cast<StoreSDNode>(GStore)->getMemoryVT().getStoreSize();
2471896fb2cSBjorn Pettersson 
2481896fb2cSBjorn Pettersson   SDValue AliasedGValue = DAG->getConstant(1, Loc, GTy);
2491896fb2cSBjorn Pettersson   SDValue AliasedGAddr = DAG->getGlobalAddress(AliasedG, Loc, GTy);
2501896fb2cSBjorn Pettersson   SDValue AliasedGStore =
2511896fb2cSBjorn Pettersson       DAG->getStore(DAG->getEntryNode(), Loc, AliasedGValue, AliasedGAddr,
2521896fb2cSBjorn Pettersson                     MachinePointerInfo(AliasedG, 0));
2531896fb2cSBjorn Pettersson 
2541896fb2cSBjorn Pettersson   bool IsAlias;
2556e41d60aSDavid Green   bool IsValid = BaseIndexOffset::computeAliasing(
2566e41d60aSDavid Green       GStore.getNode(), LocationSize::precise(GNumBytes),
2576e41d60aSDavid Green       AliasedGStore.getNode(), LocationSize::precise(GNumBytes), *DAG, IsAlias);
2581896fb2cSBjorn Pettersson 
2591896fb2cSBjorn Pettersson   // With some deeper analysis we could detect if G and AliasedG is aliasing or
2601896fb2cSBjorn Pettersson   // not. But computeAliasing is currently defensive and assumes that a
2611896fb2cSBjorn Pettersson   // GlobalAlias might alias with any global variable.
2621896fb2cSBjorn Pettersson   EXPECT_FALSE(IsValid);
2631896fb2cSBjorn Pettersson }
2641896fb2cSBjorn Pettersson 
2658d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, fixedSizeFrameObjectsWithinDiff) {
2668d06a678SHsiangkai Wang   SDLoc Loc;
2678d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
2688d06a678SHsiangkai Wang   // <vscale x 4 x i8>
2698d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
2708d06a678SHsiangkai Wang   // <vscale x 2 x i8>
2718d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
2728d06a678SHsiangkai Wang   // <2 x i8>
2738d06a678SHsiangkai Wang   auto SubFixedVecVT2xi8 = EVT::getVectorVT(Context, Int8VT, 2);
2748d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
2758d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
2768d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
2778d06a678SHsiangkai Wang   SDValue Value0 = DAG->getConstant(0, Loc, SubFixedVecVT2xi8);
2788d06a678SHsiangkai Wang   SDValue Value1 = DAG->getConstant(0, Loc, SubVecVT);
27981b7f115SSander de Smalen   TypeSize Offset0 = TypeSize::getFixed(0);
2808d06a678SHsiangkai Wang   TypeSize Offset1 = SubFixedVecVT2xi8.getStoreSize();
2818d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
2828d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
2838d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
2848d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset0));
2858d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
2868d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset1));
2876e41d60aSDavid Green   TypeSize NumBytes0 = cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize();
2886e41d60aSDavid Green   TypeSize NumBytes1 = cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize();
2898d06a678SHsiangkai Wang 
2908d06a678SHsiangkai Wang   bool IsAlias;
2918d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
2926e41d60aSDavid Green       Store0.getNode(), LocationSize::precise(NumBytes0), Store1.getNode(),
2936e41d60aSDavid Green       LocationSize::precise(NumBytes1), *DAG, IsAlias);
2948d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
2958d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
2968d06a678SHsiangkai Wang 
2978d06a678SHsiangkai Wang   IsValid = BaseIndexOffset::computeAliasing(
2986e41d60aSDavid Green       Store1.getNode(), LocationSize::precise(NumBytes1), Store0.getNode(),
2996e41d60aSDavid Green       LocationSize::precise(NumBytes0), *DAG, IsAlias);
3008d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
3018d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
3028d06a678SHsiangkai Wang }
3038d06a678SHsiangkai Wang 
3048d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, fixedSizeFrameObjectsOutOfDiff) {
3058d06a678SHsiangkai Wang   SDLoc Loc;
3068d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
3078d06a678SHsiangkai Wang   // <vscale x 4 x i8>
3088d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
3098d06a678SHsiangkai Wang   // <vscale x 2 x i8>
3108d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
3118d06a678SHsiangkai Wang   // <2 x i8>
3128d06a678SHsiangkai Wang   auto SubFixedVecVT2xi8 = EVT::getVectorVT(Context, Int8VT, 2);
3138d06a678SHsiangkai Wang   // <4 x i8>
3148d06a678SHsiangkai Wang   auto SubFixedVecVT4xi8 = EVT::getVectorVT(Context, Int8VT, 4);
3158d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
3168d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
3178d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
3188d06a678SHsiangkai Wang   SDValue Value0 = DAG->getConstant(0, Loc, SubFixedVecVT4xi8);
3198d06a678SHsiangkai Wang   SDValue Value1 = DAG->getConstant(0, Loc, SubVecVT);
32081b7f115SSander de Smalen   TypeSize Offset0 = TypeSize::getFixed(0);
3218d06a678SHsiangkai Wang   TypeSize Offset1 = SubFixedVecVT2xi8.getStoreSize();
3228d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
3238d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
3248d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
3258d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset0));
3268d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
3278d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset1));
3286e41d60aSDavid Green   TypeSize NumBytes0 = cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize();
3296e41d60aSDavid Green   TypeSize NumBytes1 = cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize();
3308d06a678SHsiangkai Wang 
3318d06a678SHsiangkai Wang   bool IsAlias;
3328d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
3336e41d60aSDavid Green       Store0.getNode(), LocationSize::precise(NumBytes0), Store1.getNode(),
3346e41d60aSDavid Green       LocationSize::precise(NumBytes1), *DAG, IsAlias);
3358d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
3368d06a678SHsiangkai Wang   EXPECT_TRUE(IsAlias);
3378d06a678SHsiangkai Wang }
3388d06a678SHsiangkai Wang 
3398d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, twoFixedStackObjects) {
3408d06a678SHsiangkai Wang   SDLoc Loc;
3418d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
3428d06a678SHsiangkai Wang   // <vscale x 2 x i8>
3438d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
3448d06a678SHsiangkai Wang   // <2 x i8>
3458d06a678SHsiangkai Wang   auto FixedVecVT = EVT::getVectorVT(Context, Int8VT, 2);
3468d06a678SHsiangkai Wang   SDValue FIPtr0 = DAG->CreateStackTemporary(FixedVecVT);
3478d06a678SHsiangkai Wang   SDValue FIPtr1 = DAG->CreateStackTemporary(VecVT);
3488d06a678SHsiangkai Wang   int FI0 = cast<FrameIndexSDNode>(FIPtr0.getNode())->getIndex();
3498d06a678SHsiangkai Wang   int FI1 = cast<FrameIndexSDNode>(FIPtr1.getNode())->getIndex();
3508d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo0 = MachinePointerInfo::getFixedStack(*MF, FI0);
3518d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo1 = MachinePointerInfo::getFixedStack(*MF, FI1);
3528d06a678SHsiangkai Wang   SDValue Value0 = DAG->getConstant(0, Loc, FixedVecVT);
3538d06a678SHsiangkai Wang   SDValue Value1 = DAG->getConstant(0, Loc, VecVT);
35481b7f115SSander de Smalen   TypeSize Offset0 = TypeSize::getFixed(0);
3558d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr0, Offset0, Loc);
3568d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr1, Offset0, Loc);
3578d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
3588d06a678SHsiangkai Wang                                  PtrInfo0.getWithOffset(Offset0));
3598d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
3608d06a678SHsiangkai Wang                                  PtrInfo1.getWithOffset(Offset0));
3616e41d60aSDavid Green   TypeSize NumBytes0 = cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize();
3626e41d60aSDavid Green   TypeSize NumBytes1 = cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize();
3638d06a678SHsiangkai Wang 
3648d06a678SHsiangkai Wang   bool IsAlias;
3658d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
3666e41d60aSDavid Green       Store0.getNode(), LocationSize::precise(NumBytes0), Store1.getNode(),
3676e41d60aSDavid Green       LocationSize::precise(NumBytes1), *DAG, IsAlias);
3688d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
3698d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
3708d06a678SHsiangkai Wang }
3718d06a678SHsiangkai Wang 
3728d06a678SHsiangkai Wang } // end namespace llvm
373