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