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"
16*89b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
178d06a678SHsiangkai Wang #include "llvm/Support/SourceMgr.h"
188d06a678SHsiangkai Wang #include "llvm/Support/TargetSelect.h"
198d06a678SHsiangkai Wang #include "llvm/Target/TargetMachine.h"
208d06a678SHsiangkai Wang #include "gtest/gtest.h"
218d06a678SHsiangkai Wang 
228d06a678SHsiangkai Wang namespace llvm {
238d06a678SHsiangkai Wang 
248d06a678SHsiangkai Wang class SelectionDAGAddressAnalysisTest : public testing::Test {
258d06a678SHsiangkai Wang protected:
SetUpTestCase()268d06a678SHsiangkai Wang   static void SetUpTestCase() {
278d06a678SHsiangkai Wang     InitializeAllTargets();
288d06a678SHsiangkai Wang     InitializeAllTargetMCs();
298d06a678SHsiangkai Wang   }
308d06a678SHsiangkai Wang 
SetUp()318d06a678SHsiangkai Wang   void SetUp() override {
328d06a678SHsiangkai Wang     StringRef Assembly = "@g = global i32 0\n"
331896fb2cSBjorn Pettersson                          "@g_alias = alias i32, i32* @g\n"
348d06a678SHsiangkai Wang                          "define i32 @f() {\n"
358d06a678SHsiangkai Wang                          "  %1 = load i32, i32* @g\n"
368d06a678SHsiangkai Wang                          "  ret i32 %1\n"
378d06a678SHsiangkai Wang                          "}";
388d06a678SHsiangkai Wang 
398d06a678SHsiangkai Wang     Triple TargetTriple("aarch64--");
408d06a678SHsiangkai Wang     std::string Error;
418d06a678SHsiangkai Wang     const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
428d06a678SHsiangkai Wang     // FIXME: These tests do not depend on AArch64 specifically, but we have to
438d06a678SHsiangkai Wang     // initialize a target. A skeleton Target for unittests would allow us to
448d06a678SHsiangkai Wang     // always run these tests.
458d06a678SHsiangkai Wang     if (!T)
465bbf1feaSIgor Kudrin       GTEST_SKIP();
478d06a678SHsiangkai Wang 
488d06a678SHsiangkai Wang     TargetOptions Options;
498d06a678SHsiangkai Wang     TM = std::unique_ptr<LLVMTargetMachine>(static_cast<LLVMTargetMachine *>(
508d06a678SHsiangkai Wang         T->createTargetMachine("AArch64", "", "+sve", Options, None, None,
518d06a678SHsiangkai Wang                                CodeGenOpt::Aggressive)));
528d06a678SHsiangkai Wang     if (!TM)
535bbf1feaSIgor Kudrin       GTEST_SKIP();
548d06a678SHsiangkai Wang 
558d06a678SHsiangkai Wang     SMDiagnostic SMError;
568d06a678SHsiangkai Wang     M = parseAssemblyString(Assembly, SMError, Context);
578d06a678SHsiangkai Wang     if (!M)
588d06a678SHsiangkai Wang       report_fatal_error(SMError.getMessage());
598d06a678SHsiangkai Wang     M->setDataLayout(TM->createDataLayout());
608d06a678SHsiangkai Wang 
618d06a678SHsiangkai Wang     F = M->getFunction("f");
628d06a678SHsiangkai Wang     if (!F)
638d06a678SHsiangkai Wang       report_fatal_error("F?");
648d06a678SHsiangkai Wang     G = M->getGlobalVariable("g");
658d06a678SHsiangkai Wang     if (!G)
668d06a678SHsiangkai Wang       report_fatal_error("G?");
671896fb2cSBjorn Pettersson     AliasedG = M->getNamedAlias("g_alias");
681896fb2cSBjorn Pettersson     if (!AliasedG)
691896fb2cSBjorn Pettersson       report_fatal_error("AliasedG?");
708d06a678SHsiangkai Wang 
718d06a678SHsiangkai Wang     MachineModuleInfo MMI(TM.get());
728d06a678SHsiangkai Wang 
738d06a678SHsiangkai Wang     MF = std::make_unique<MachineFunction>(*F, *TM, *TM->getSubtargetImpl(*F),
748d06a678SHsiangkai Wang                                            0, MMI);
758d06a678SHsiangkai Wang 
768d06a678SHsiangkai Wang     DAG = std::make_unique<SelectionDAG>(*TM, CodeGenOpt::None);
778d06a678SHsiangkai Wang     if (!DAG)
788d06a678SHsiangkai Wang       report_fatal_error("DAG?");
798d06a678SHsiangkai Wang     OptimizationRemarkEmitter ORE(F);
808d06a678SHsiangkai Wang     DAG->init(*MF, ORE, nullptr, nullptr, nullptr, nullptr, nullptr);
818d06a678SHsiangkai Wang   }
828d06a678SHsiangkai Wang 
getTypeAction(EVT VT)838d06a678SHsiangkai Wang   TargetLoweringBase::LegalizeTypeAction getTypeAction(EVT VT) {
848d06a678SHsiangkai Wang     return DAG->getTargetLoweringInfo().getTypeAction(Context, VT);
858d06a678SHsiangkai Wang   }
868d06a678SHsiangkai Wang 
getTypeToTransformTo(EVT VT)878d06a678SHsiangkai Wang   EVT getTypeToTransformTo(EVT VT) {
888d06a678SHsiangkai Wang     return DAG->getTargetLoweringInfo().getTypeToTransformTo(Context, VT);
898d06a678SHsiangkai Wang   }
908d06a678SHsiangkai Wang 
918d06a678SHsiangkai Wang   LLVMContext Context;
928d06a678SHsiangkai Wang   std::unique_ptr<LLVMTargetMachine> TM;
938d06a678SHsiangkai Wang   std::unique_ptr<Module> M;
948d06a678SHsiangkai Wang   Function *F;
958d06a678SHsiangkai Wang   GlobalVariable *G;
961896fb2cSBjorn Pettersson   GlobalAlias *AliasedG;
978d06a678SHsiangkai Wang   std::unique_ptr<MachineFunction> MF;
988d06a678SHsiangkai Wang   std::unique_ptr<SelectionDAG> DAG;
998d06a678SHsiangkai Wang };
1008d06a678SHsiangkai Wang 
TEST_F(SelectionDAGAddressAnalysisTest,sameFrameObject)1018d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, sameFrameObject) {
1028d06a678SHsiangkai Wang   SDLoc Loc;
1038d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
1048d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
1058d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1068d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1078d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
1088d06a678SHsiangkai Wang   TypeSize Offset = TypeSize::Fixed(0);
1098d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, VecVT);
1108d06a678SHsiangkai Wang   SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
1118d06a678SHsiangkai Wang   SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
1128d06a678SHsiangkai Wang                                 PtrInfo.getWithOffset(Offset));
1138d06a678SHsiangkai Wang   Optional<int64_t> NumBytes = MemoryLocation::getSizeOrUnknown(
1148d06a678SHsiangkai Wang       cast<StoreSDNode>(Store)->getMemoryVT().getStoreSize());
1158d06a678SHsiangkai Wang 
1168d06a678SHsiangkai Wang   bool IsAlias;
1178d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
1188d06a678SHsiangkai Wang       Store.getNode(), NumBytes, Store.getNode(), NumBytes, *DAG, IsAlias);
1198d06a678SHsiangkai Wang 
1208d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
1218d06a678SHsiangkai Wang   EXPECT_TRUE(IsAlias);
1228d06a678SHsiangkai Wang }
1238d06a678SHsiangkai Wang 
TEST_F(SelectionDAGAddressAnalysisTest,sameFrameObjectUnknownSize)1248ed0e6b2SBjorn Pettersson TEST_F(SelectionDAGAddressAnalysisTest, sameFrameObjectUnknownSize) {
1258ed0e6b2SBjorn Pettersson   SDLoc Loc;
1268ed0e6b2SBjorn Pettersson   auto Int8VT = EVT::getIntegerVT(Context, 8);
1278ed0e6b2SBjorn Pettersson   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
1288ed0e6b2SBjorn Pettersson   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1298ed0e6b2SBjorn Pettersson   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1308ed0e6b2SBjorn Pettersson   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
1318ed0e6b2SBjorn Pettersson   TypeSize Offset = TypeSize::Fixed(0);
1328ed0e6b2SBjorn Pettersson   SDValue Value = DAG->getConstant(0, Loc, VecVT);
1338ed0e6b2SBjorn Pettersson   SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
1348ed0e6b2SBjorn Pettersson   SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
1358ed0e6b2SBjorn Pettersson                                 PtrInfo.getWithOffset(Offset));
1368ed0e6b2SBjorn Pettersson 
1378ed0e6b2SBjorn Pettersson   // Maybe unlikely that BaseIndexOffset::computeAliasing is used with the
1388ed0e6b2SBjorn Pettersson   // optional NumBytes being unset like in this test, but it would be confusing
1398ed0e6b2SBjorn Pettersson   // if that function determined IsAlias=false here.
1408ed0e6b2SBjorn Pettersson   Optional<int64_t> NumBytes;
1418ed0e6b2SBjorn Pettersson 
1428ed0e6b2SBjorn Pettersson   bool IsAlias;
1438ed0e6b2SBjorn Pettersson   bool IsValid = BaseIndexOffset::computeAliasing(
1448ed0e6b2SBjorn Pettersson       Store.getNode(), NumBytes, Store.getNode(), NumBytes, *DAG, IsAlias);
1458ed0e6b2SBjorn Pettersson 
1468ed0e6b2SBjorn Pettersson   EXPECT_FALSE(IsValid);
1478ed0e6b2SBjorn Pettersson }
1488ed0e6b2SBjorn Pettersson 
TEST_F(SelectionDAGAddressAnalysisTest,noAliasingFrameObjects)1498d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, noAliasingFrameObjects) {
1508d06a678SHsiangkai Wang   SDLoc Loc;
1518d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
1528d06a678SHsiangkai Wang   // <4 x i8>
1538d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
1548d06a678SHsiangkai Wang   // <2 x i8>
1558d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2);
1568d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1578d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1588d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
1598d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, SubVecVT);
1608d06a678SHsiangkai Wang   TypeSize Offset0 = TypeSize::Fixed(0);
1618d06a678SHsiangkai Wang   TypeSize Offset1 = SubVecVT.getStoreSize();
1628d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
1638d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
1648d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index0,
1658d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset0));
1668d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index1,
1678d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset1));
1688d06a678SHsiangkai Wang   Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
1698d06a678SHsiangkai Wang       cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
1708d06a678SHsiangkai Wang   Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
1718d06a678SHsiangkai Wang       cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
1728d06a678SHsiangkai Wang 
1738d06a678SHsiangkai Wang   bool IsAlias;
1748d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
1758d06a678SHsiangkai Wang       Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
1768d06a678SHsiangkai Wang 
1778d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
1788d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
1798d06a678SHsiangkai Wang }
1808d06a678SHsiangkai Wang 
TEST_F(SelectionDAGAddressAnalysisTest,unknownSizeFrameObjects)1818d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, unknownSizeFrameObjects) {
1828d06a678SHsiangkai Wang   SDLoc Loc;
1838d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
1848d06a678SHsiangkai Wang   // <vscale x 4 x i8>
1858d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
1868d06a678SHsiangkai Wang   // <vscale x 2 x i8>
1878d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
1888d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
1898d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
1908d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
1918d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, SubVecVT);
1928d06a678SHsiangkai Wang   TypeSize Offset1 = SubVecVT.getStoreSize();
1938d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
194305a0badSCraig Topper   SDValue Store0 =
195305a0badSCraig Topper       DAG->getStore(DAG->getEntryNode(), Loc, Value, FIPtr, PtrInfo);
1968d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index1,
197305a0badSCraig Topper                                  MachinePointerInfo(PtrInfo.getAddrSpace()));
1988d06a678SHsiangkai Wang   Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
1998d06a678SHsiangkai Wang       cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
2008d06a678SHsiangkai Wang   Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
2018d06a678SHsiangkai Wang       cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
2028d06a678SHsiangkai Wang 
2038d06a678SHsiangkai Wang   bool IsAlias;
2048d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
2058d06a678SHsiangkai Wang       Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
2068d06a678SHsiangkai Wang 
2078d06a678SHsiangkai Wang   EXPECT_FALSE(IsValid);
2088d06a678SHsiangkai Wang }
2098d06a678SHsiangkai Wang 
TEST_F(SelectionDAGAddressAnalysisTest,globalWithFrameObject)2108d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, globalWithFrameObject) {
2118d06a678SHsiangkai Wang   SDLoc Loc;
2128d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
2138d06a678SHsiangkai Wang   // <vscale x 4 x i8>
2148d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
2158d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
2168d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
2178d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
2188d06a678SHsiangkai Wang   SDValue Value = DAG->getConstant(0, Loc, VecVT);
2198d06a678SHsiangkai Wang   TypeSize Offset = TypeSize::Fixed(0);
2208d06a678SHsiangkai Wang   SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
2218d06a678SHsiangkai Wang   SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
2228d06a678SHsiangkai Wang                                 PtrInfo.getWithOffset(Offset));
2238d06a678SHsiangkai Wang   Optional<int64_t> NumBytes = MemoryLocation::getSizeOrUnknown(
2248d06a678SHsiangkai Wang       cast<StoreSDNode>(Store)->getMemoryVT().getStoreSize());
2258d06a678SHsiangkai Wang   EVT GTy = DAG->getTargetLoweringInfo().getValueType(DAG->getDataLayout(),
2268d06a678SHsiangkai Wang                                                       G->getType());
2278d06a678SHsiangkai Wang   SDValue GValue = DAG->getConstant(0, Loc, GTy);
2288d06a678SHsiangkai Wang   SDValue GAddr = DAG->getGlobalAddress(G, Loc, GTy);
2298d06a678SHsiangkai Wang   SDValue GStore = DAG->getStore(DAG->getEntryNode(), Loc, GValue, GAddr,
2308d06a678SHsiangkai Wang                                  MachinePointerInfo(G, 0));
2318d06a678SHsiangkai Wang   Optional<int64_t> GNumBytes = MemoryLocation::getSizeOrUnknown(
2328d06a678SHsiangkai Wang       cast<StoreSDNode>(GStore)->getMemoryVT().getStoreSize());
2338d06a678SHsiangkai Wang 
2348d06a678SHsiangkai Wang   bool IsAlias;
2358d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
2368d06a678SHsiangkai Wang       Store.getNode(), NumBytes, GStore.getNode(), GNumBytes, *DAG, IsAlias);
2378d06a678SHsiangkai Wang 
2388d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
2398d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
2408d06a678SHsiangkai Wang }
2418d06a678SHsiangkai Wang 
TEST_F(SelectionDAGAddressAnalysisTest,globalWithAliasedGlobal)2421896fb2cSBjorn Pettersson TEST_F(SelectionDAGAddressAnalysisTest, globalWithAliasedGlobal) {
2431896fb2cSBjorn Pettersson   SDLoc Loc;
2441896fb2cSBjorn Pettersson 
2451896fb2cSBjorn Pettersson   EVT GTy = DAG->getTargetLoweringInfo().getValueType(DAG->getDataLayout(),
2461896fb2cSBjorn Pettersson                                                       G->getType());
2471896fb2cSBjorn Pettersson   SDValue GValue = DAG->getConstant(0, Loc, GTy);
2481896fb2cSBjorn Pettersson   SDValue GAddr = DAG->getGlobalAddress(G, Loc, GTy);
2491896fb2cSBjorn Pettersson   SDValue GStore = DAG->getStore(DAG->getEntryNode(), Loc, GValue, GAddr,
2501896fb2cSBjorn Pettersson                                  MachinePointerInfo(G, 0));
2511896fb2cSBjorn Pettersson   Optional<int64_t> GNumBytes = MemoryLocation::getSizeOrUnknown(
2521896fb2cSBjorn Pettersson       cast<StoreSDNode>(GStore)->getMemoryVT().getStoreSize());
2531896fb2cSBjorn Pettersson 
2541896fb2cSBjorn Pettersson   SDValue AliasedGValue = DAG->getConstant(1, Loc, GTy);
2551896fb2cSBjorn Pettersson   SDValue AliasedGAddr = DAG->getGlobalAddress(AliasedG, Loc, GTy);
2561896fb2cSBjorn Pettersson   SDValue AliasedGStore =
2571896fb2cSBjorn Pettersson       DAG->getStore(DAG->getEntryNode(), Loc, AliasedGValue, AliasedGAddr,
2581896fb2cSBjorn Pettersson                     MachinePointerInfo(AliasedG, 0));
2591896fb2cSBjorn Pettersson 
2601896fb2cSBjorn Pettersson   bool IsAlias;
2611896fb2cSBjorn Pettersson   bool IsValid = BaseIndexOffset::computeAliasing(GStore.getNode(), GNumBytes,
2621896fb2cSBjorn Pettersson                                                   AliasedGStore.getNode(),
2631896fb2cSBjorn Pettersson                                                   GNumBytes, *DAG, IsAlias);
2641896fb2cSBjorn Pettersson 
2651896fb2cSBjorn Pettersson   // With some deeper analysis we could detect if G and AliasedG is aliasing or
2661896fb2cSBjorn Pettersson   // not. But computeAliasing is currently defensive and assumes that a
2671896fb2cSBjorn Pettersson   // GlobalAlias might alias with any global variable.
2681896fb2cSBjorn Pettersson   EXPECT_FALSE(IsValid);
2691896fb2cSBjorn Pettersson }
2701896fb2cSBjorn Pettersson 
TEST_F(SelectionDAGAddressAnalysisTest,fixedSizeFrameObjectsWithinDiff)2718d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, fixedSizeFrameObjectsWithinDiff) {
2728d06a678SHsiangkai Wang   SDLoc Loc;
2738d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
2748d06a678SHsiangkai Wang   // <vscale x 4 x i8>
2758d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
2768d06a678SHsiangkai Wang   // <vscale x 2 x i8>
2778d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
2788d06a678SHsiangkai Wang   // <2 x i8>
2798d06a678SHsiangkai Wang   auto SubFixedVecVT2xi8 = EVT::getVectorVT(Context, Int8VT, 2);
2808d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
2818d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
2828d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
2838d06a678SHsiangkai Wang   SDValue Value0 = DAG->getConstant(0, Loc, SubFixedVecVT2xi8);
2848d06a678SHsiangkai Wang   SDValue Value1 = DAG->getConstant(0, Loc, SubVecVT);
2858d06a678SHsiangkai Wang   TypeSize Offset0 = TypeSize::Fixed(0);
2868d06a678SHsiangkai Wang   TypeSize Offset1 = SubFixedVecVT2xi8.getStoreSize();
2878d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
2888d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
2898d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
2908d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset0));
2918d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
2928d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset1));
2938d06a678SHsiangkai Wang   Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
2948d06a678SHsiangkai Wang       cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
2958d06a678SHsiangkai Wang   Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
2968d06a678SHsiangkai Wang       cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
2978d06a678SHsiangkai Wang 
2988d06a678SHsiangkai Wang   bool IsAlias;
2998d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
3008d06a678SHsiangkai Wang       Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
3018d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
3028d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
3038d06a678SHsiangkai Wang 
3048d06a678SHsiangkai Wang   IsValid = BaseIndexOffset::computeAliasing(
3058d06a678SHsiangkai Wang       Store1.getNode(), NumBytes1, Store0.getNode(), NumBytes0, *DAG, IsAlias);
3068d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
3078d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
3088d06a678SHsiangkai Wang }
3098d06a678SHsiangkai Wang 
TEST_F(SelectionDAGAddressAnalysisTest,fixedSizeFrameObjectsOutOfDiff)3108d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, fixedSizeFrameObjectsOutOfDiff) {
3118d06a678SHsiangkai Wang   SDLoc Loc;
3128d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
3138d06a678SHsiangkai Wang   // <vscale x 4 x i8>
3148d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
3158d06a678SHsiangkai Wang   // <vscale x 2 x i8>
3168d06a678SHsiangkai Wang   auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
3178d06a678SHsiangkai Wang   // <2 x i8>
3188d06a678SHsiangkai Wang   auto SubFixedVecVT2xi8 = EVT::getVectorVT(Context, Int8VT, 2);
3198d06a678SHsiangkai Wang   // <4 x i8>
3208d06a678SHsiangkai Wang   auto SubFixedVecVT4xi8 = EVT::getVectorVT(Context, Int8VT, 4);
3218d06a678SHsiangkai Wang   SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
3228d06a678SHsiangkai Wang   int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
3238d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
3248d06a678SHsiangkai Wang   SDValue Value0 = DAG->getConstant(0, Loc, SubFixedVecVT4xi8);
3258d06a678SHsiangkai Wang   SDValue Value1 = DAG->getConstant(0, Loc, SubVecVT);
3268d06a678SHsiangkai Wang   TypeSize Offset0 = TypeSize::Fixed(0);
3278d06a678SHsiangkai Wang   TypeSize Offset1 = SubFixedVecVT2xi8.getStoreSize();
3288d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
3298d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
3308d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
3318d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset0));
3328d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
3338d06a678SHsiangkai Wang                                  PtrInfo.getWithOffset(Offset1));
3348d06a678SHsiangkai Wang   Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
3358d06a678SHsiangkai Wang       cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
3368d06a678SHsiangkai Wang   Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
3378d06a678SHsiangkai Wang       cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
3388d06a678SHsiangkai Wang 
3398d06a678SHsiangkai Wang   bool IsAlias;
3408d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
3418d06a678SHsiangkai Wang       Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
3428d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
3438d06a678SHsiangkai Wang   EXPECT_TRUE(IsAlias);
3448d06a678SHsiangkai Wang }
3458d06a678SHsiangkai Wang 
TEST_F(SelectionDAGAddressAnalysisTest,twoFixedStackObjects)3468d06a678SHsiangkai Wang TEST_F(SelectionDAGAddressAnalysisTest, twoFixedStackObjects) {
3478d06a678SHsiangkai Wang   SDLoc Loc;
3488d06a678SHsiangkai Wang   auto Int8VT = EVT::getIntegerVT(Context, 8);
3498d06a678SHsiangkai Wang   // <vscale x 2 x i8>
3508d06a678SHsiangkai Wang   auto VecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
3518d06a678SHsiangkai Wang   // <2 x i8>
3528d06a678SHsiangkai Wang   auto FixedVecVT = EVT::getVectorVT(Context, Int8VT, 2);
3538d06a678SHsiangkai Wang   SDValue FIPtr0 = DAG->CreateStackTemporary(FixedVecVT);
3548d06a678SHsiangkai Wang   SDValue FIPtr1 = DAG->CreateStackTemporary(VecVT);
3558d06a678SHsiangkai Wang   int FI0 = cast<FrameIndexSDNode>(FIPtr0.getNode())->getIndex();
3568d06a678SHsiangkai Wang   int FI1 = cast<FrameIndexSDNode>(FIPtr1.getNode())->getIndex();
3578d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo0 = MachinePointerInfo::getFixedStack(*MF, FI0);
3588d06a678SHsiangkai Wang   MachinePointerInfo PtrInfo1 = MachinePointerInfo::getFixedStack(*MF, FI1);
3598d06a678SHsiangkai Wang   SDValue Value0 = DAG->getConstant(0, Loc, FixedVecVT);
3608d06a678SHsiangkai Wang   SDValue Value1 = DAG->getConstant(0, Loc, VecVT);
3618d06a678SHsiangkai Wang   TypeSize Offset0 = TypeSize::Fixed(0);
3628d06a678SHsiangkai Wang   SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr0, Offset0, Loc);
3638d06a678SHsiangkai Wang   SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr1, Offset0, Loc);
3648d06a678SHsiangkai Wang   SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
3658d06a678SHsiangkai Wang                                  PtrInfo0.getWithOffset(Offset0));
3668d06a678SHsiangkai Wang   SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
3678d06a678SHsiangkai Wang                                  PtrInfo1.getWithOffset(Offset0));
3688d06a678SHsiangkai Wang   Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
3698d06a678SHsiangkai Wang       cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
3708d06a678SHsiangkai Wang   Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
3718d06a678SHsiangkai Wang       cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
3728d06a678SHsiangkai Wang 
3738d06a678SHsiangkai Wang   bool IsAlias;
3748d06a678SHsiangkai Wang   bool IsValid = BaseIndexOffset::computeAliasing(
3758d06a678SHsiangkai Wang       Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
3768d06a678SHsiangkai Wang   EXPECT_TRUE(IsValid);
3778d06a678SHsiangkai Wang   EXPECT_FALSE(IsAlias);
3788d06a678SHsiangkai Wang }
3798d06a678SHsiangkai Wang 
3808d06a678SHsiangkai Wang } // end namespace llvm
381