annotate llvm/unittests/CodeGen/SelectionDAGAddressAnalysisTest.cpp @ 235:edfff9242030 cbc-llvm13

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 21 Jul 2021 11:30:30 +0900
parents 2e18cbf3894f
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- llvm/unittest/CodeGen/SelectionDAGAddressAnalysisTest.cpp ---------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 //
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 #include "llvm/CodeGen/SelectionDAGAddressAnalysis.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include "llvm/Analysis/MemoryLocation.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 #include "llvm/AsmParser/Parser.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 #include "llvm/CodeGen/MachineModuleInfo.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #include "llvm/CodeGen/SelectionDAG.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include "llvm/CodeGen/TargetLowering.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #include "llvm/Support/SourceMgr.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 #include "llvm/Support/TargetRegistry.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/Support/TargetSelect.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include "llvm/Target/TargetMachine.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include "gtest/gtest.h"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 namespace llvm {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 class SelectionDAGAddressAnalysisTest : public testing::Test {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 protected:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 static void SetUpTestCase() {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 InitializeAllTargets();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 InitializeAllTargetMCs();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 void SetUp() override {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 StringRef Assembly = "@g = global i32 0\n"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 "define i32 @f() {\n"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 " %1 = load i32, i32* @g\n"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 " ret i32 %1\n"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 "}";
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 Triple TargetTriple("aarch64--");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 std::string Error;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 const Target *T = TargetRegistry::lookupTarget("", TargetTriple, Error);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 // FIXME: These tests do not depend on AArch64 specifically, but we have to
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 // initialize a target. A skeleton Target for unittests would allow us to
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 // always run these tests.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 if (!T)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 GTEST_SKIP();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 TargetOptions Options;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 TM = std::unique_ptr<LLVMTargetMachine>(static_cast<LLVMTargetMachine *>(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 T->createTargetMachine("AArch64", "", "+sve", Options, None, None,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 CodeGenOpt::Aggressive)));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 if (!TM)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 GTEST_SKIP();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 SMDiagnostic SMError;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 M = parseAssemblyString(Assembly, SMError, Context);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 if (!M)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 report_fatal_error(SMError.getMessage());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 M->setDataLayout(TM->createDataLayout());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 F = M->getFunction("f");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 if (!F)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 report_fatal_error("F?");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 G = M->getGlobalVariable("g");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 if (!G)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 report_fatal_error("G?");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 MachineModuleInfo MMI(TM.get());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 MF = std::make_unique<MachineFunction>(*F, *TM, *TM->getSubtargetImpl(*F),
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 0, MMI);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 DAG = std::make_unique<SelectionDAG>(*TM, CodeGenOpt::None);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 if (!DAG)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 report_fatal_error("DAG?");
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 OptimizationRemarkEmitter ORE(F);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 DAG->init(*MF, ORE, nullptr, nullptr, nullptr, nullptr, nullptr);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 TargetLoweringBase::LegalizeTypeAction getTypeAction(EVT VT) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 return DAG->getTargetLoweringInfo().getTypeAction(Context, VT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 EVT getTypeToTransformTo(EVT VT) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 return DAG->getTargetLoweringInfo().getTypeToTransformTo(Context, VT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 LLVMContext Context;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 std::unique_ptr<LLVMTargetMachine> TM;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 std::unique_ptr<Module> M;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 Function *F;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 GlobalVariable *G;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 std::unique_ptr<MachineFunction> MF;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 std::unique_ptr<SelectionDAG> DAG;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 };
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 TEST_F(SelectionDAGAddressAnalysisTest, sameFrameObject) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 SDLoc Loc;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 auto Int8VT = EVT::getIntegerVT(Context, 8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 TypeSize Offset = TypeSize::Fixed(0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 SDValue Value = DAG->getConstant(0, Loc, VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 PtrInfo.getWithOffset(Offset));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 Optional<int64_t> NumBytes = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 cast<StoreSDNode>(Store)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 bool IsAlias;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 bool IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 Store.getNode(), NumBytes, Store.getNode(), NumBytes, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 EXPECT_TRUE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 EXPECT_TRUE(IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 TEST_F(SelectionDAGAddressAnalysisTest, noAliasingFrameObjects) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 SDLoc Loc;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 auto Int8VT = EVT::getIntegerVT(Context, 8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 // <4 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 auto VecVT = EVT::getVectorVT(Context, Int8VT, 4);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 // <2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 SDValue Value = DAG->getConstant(0, Loc, SubVecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 TypeSize Offset0 = TypeSize::Fixed(0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 TypeSize Offset1 = SubVecVT.getStoreSize();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index0,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 PtrInfo.getWithOffset(Offset0));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index1,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 PtrInfo.getWithOffset(Offset1));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 bool IsAlias;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 bool IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 EXPECT_TRUE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 EXPECT_FALSE(IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 TEST_F(SelectionDAGAddressAnalysisTest, unknownSizeFrameObjects) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 SDLoc Loc;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 auto Int8VT = EVT::getIntegerVT(Context, 8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 // <vscale x 4 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 // <vscale x 2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 SDValue Value = DAG->getConstant(0, Loc, SubVecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 TypeSize Offset1 = SubVecVT.getStoreSize();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 SDValue Store0 =
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 DAG->getStore(DAG->getEntryNode(), Loc, Value, FIPtr, PtrInfo);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index1,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 MachinePointerInfo(PtrInfo.getAddrSpace()));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 bool IsAlias;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 bool IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 EXPECT_FALSE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 TEST_F(SelectionDAGAddressAnalysisTest, globalWithFrameObject) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 SDLoc Loc;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 auto Int8VT = EVT::getIntegerVT(Context, 8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 // <vscale x 4 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 SDValue Value = DAG->getConstant(0, Loc, VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 TypeSize Offset = TypeSize::Fixed(0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 SDValue Index = DAG->getMemBasePlusOffset(FIPtr, Offset, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 SDValue Store = DAG->getStore(DAG->getEntryNode(), Loc, Value, Index,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 PtrInfo.getWithOffset(Offset));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 Optional<int64_t> NumBytes = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 cast<StoreSDNode>(Store)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 EVT GTy = DAG->getTargetLoweringInfo().getValueType(DAG->getDataLayout(),
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 G->getType());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 SDValue GValue = DAG->getConstant(0, Loc, GTy);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 SDValue GAddr = DAG->getGlobalAddress(G, Loc, GTy);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 SDValue GStore = DAG->getStore(DAG->getEntryNode(), Loc, GValue, GAddr,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 MachinePointerInfo(G, 0));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 Optional<int64_t> GNumBytes = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 cast<StoreSDNode>(GStore)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 bool IsAlias;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 bool IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 Store.getNode(), NumBytes, GStore.getNode(), GNumBytes, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 EXPECT_TRUE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 EXPECT_FALSE(IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 TEST_F(SelectionDAGAddressAnalysisTest, fixedSizeFrameObjectsWithinDiff) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 SDLoc Loc;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 auto Int8VT = EVT::getIntegerVT(Context, 8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 // <vscale x 4 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 // <vscale x 2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 // <2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 auto SubFixedVecVT2xi8 = EVT::getVectorVT(Context, Int8VT, 2);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224 SDValue Value0 = DAG->getConstant(0, Loc, SubFixedVecVT2xi8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 SDValue Value1 = DAG->getConstant(0, Loc, SubVecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 TypeSize Offset0 = TypeSize::Fixed(0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 TypeSize Offset1 = SubFixedVecVT2xi8.getStoreSize();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228 SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 PtrInfo.getWithOffset(Offset0));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 PtrInfo.getWithOffset(Offset1));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 bool IsAlias;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 bool IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 EXPECT_TRUE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 EXPECT_FALSE(IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 Store1.getNode(), NumBytes1, Store0.getNode(), NumBytes0, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 EXPECT_TRUE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 EXPECT_FALSE(IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 TEST_F(SelectionDAGAddressAnalysisTest, fixedSizeFrameObjectsOutOfDiff) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 SDLoc Loc;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 auto Int8VT = EVT::getIntegerVT(Context, 8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 // <vscale x 4 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 auto VecVT = EVT::getVectorVT(Context, Int8VT, 4, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 // <vscale x 2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 auto SubVecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 // <2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 auto SubFixedVecVT2xi8 = EVT::getVectorVT(Context, Int8VT, 2);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 // <4 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 auto SubFixedVecVT4xi8 = EVT::getVectorVT(Context, Int8VT, 4);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 SDValue FIPtr = DAG->CreateStackTemporary(VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
264 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(*MF, FI);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 SDValue Value0 = DAG->getConstant(0, Loc, SubFixedVecVT4xi8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 SDValue Value1 = DAG->getConstant(0, Loc, SubVecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 TypeSize Offset0 = TypeSize::Fixed(0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 TypeSize Offset1 = SubFixedVecVT2xi8.getStoreSize();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr, Offset0, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr, Offset1, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 PtrInfo.getWithOffset(Offset0));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 PtrInfo.getWithOffset(Offset1));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 bool IsAlias;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
281 bool IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283 EXPECT_TRUE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 EXPECT_TRUE(IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 TEST_F(SelectionDAGAddressAnalysisTest, twoFixedStackObjects) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 SDLoc Loc;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 auto Int8VT = EVT::getIntegerVT(Context, 8);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 // <vscale x 2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 auto VecVT = EVT::getVectorVT(Context, Int8VT, 2, true);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 // <2 x i8>
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 auto FixedVecVT = EVT::getVectorVT(Context, Int8VT, 2);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
294 SDValue FIPtr0 = DAG->CreateStackTemporary(FixedVecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 SDValue FIPtr1 = DAG->CreateStackTemporary(VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
296 int FI0 = cast<FrameIndexSDNode>(FIPtr0.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 int FI1 = cast<FrameIndexSDNode>(FIPtr1.getNode())->getIndex();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 MachinePointerInfo PtrInfo0 = MachinePointerInfo::getFixedStack(*MF, FI0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 MachinePointerInfo PtrInfo1 = MachinePointerInfo::getFixedStack(*MF, FI1);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 SDValue Value0 = DAG->getConstant(0, Loc, FixedVecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 SDValue Value1 = DAG->getConstant(0, Loc, VecVT);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 TypeSize Offset0 = TypeSize::Fixed(0);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 SDValue Index0 = DAG->getMemBasePlusOffset(FIPtr0, Offset0, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 SDValue Index1 = DAG->getMemBasePlusOffset(FIPtr1, Offset0, Loc);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 SDValue Store0 = DAG->getStore(DAG->getEntryNode(), Loc, Value0, Index0,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 PtrInfo0.getWithOffset(Offset0));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 SDValue Store1 = DAG->getStore(DAG->getEntryNode(), Loc, Value1, Index1,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 PtrInfo1.getWithOffset(Offset0));
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 Optional<int64_t> NumBytes0 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 cast<StoreSDNode>(Store0)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 Optional<int64_t> NumBytes1 = MemoryLocation::getSizeOrUnknown(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 cast<StoreSDNode>(Store1)->getMemoryVT().getStoreSize());
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 bool IsAlias;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 bool IsValid = BaseIndexOffset::computeAliasing(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 Store0.getNode(), NumBytes0, Store1.getNode(), NumBytes1, *DAG, IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 EXPECT_TRUE(IsValid);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 EXPECT_FALSE(IsAlias);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 } // end namespace llvm