• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef LIBLLVMBACKEND_LOWERING_LLVM_IR_CONSTRUCTOR_H
17 #define LIBLLVMBACKEND_LOWERING_LLVM_IR_CONSTRUCTOR_H
18 
19 #include "optimizer/ir/graph.h"
20 #include "optimizer/ir/graph_visitor.h"
21 #include "optimizer/ir/inst.h"
22 
23 #include "debug_data_builder.h"
24 #include "llvm_ark_interface.h"
25 
26 #include <llvm/IR/Function.h>
27 #include <llvm/IR/IRBuilder.h>
28 
29 namespace ark::compiler {
30 
31 class LLVMIrConstructor : public GraphVisitor {
32     bool IsSafeCast(Inst *inst, unsigned int index);
33     bool TryEmitIntrinsic(Inst *inst, RuntimeInterface::IntrinsicId arkId);
34 
35 private:
36     // Specific intrinsic Emitters
37     bool EmitFastPath(Inst *inst, RuntimeInterface::EntrypointId eid, uint32_t numArgs);
38     bool EmitStringEquals(Inst *inst);
39     bool EmitStringBuilderBool(Inst *inst);
40     bool EmitStringBuilderChar(Inst *inst);
41     bool EmitStringBuilderString(Inst *inst);
42     bool EmitStringConcat2(Inst *inst);
43     bool EmitStringConcat3(Inst *inst);
44     bool EmitStringConcat4(Inst *inst);
45     bool EmitStringCompareTo(Inst *inst);
46     bool EmitIsInf(Inst *inst);
47     bool EmitUnreachable(Inst *inst);
48     bool EmitNothing(Inst *inst);
49     bool EmitSlowPathEntry(Inst *inst);
50     bool EmitExclusiveLoadWithAcquire(Inst *inst);
51     bool EmitExclusiveStoreWithRelease(Inst *inst);
52     bool EmitInterpreterReturn(Inst *inst);
53     bool EmitTailCall(Inst *inst);
54     bool EmitCompressEightUtf16ToUtf8CharsUsingSimd(Inst *inst);
55     bool EmitCompressSixteenUtf16ToUtf8CharsUsingSimd(Inst *inst);
56     bool EmitReverseBytes(Inst *inst);
57     bool EmitMemoryFenceFull(Inst *inst);
58     bool EmitMemoryFenceRelease(Inst *inst);
59     bool EmitMemoryFenceAcquire(Inst *inst);
60     bool EmitFround(Inst *inst);
61     bool EmitCtlz(Inst *inst);
62     bool EmitCttz(Inst *inst);
63     bool EmitSignbit(Inst *inst);
64     bool EmitIsInteger(Inst *inst);
65     bool EmitIsSafeInteger(Inst *inst);
66     bool EmitRawBitcastToInt(Inst *inst);
67     bool EmitRawBitcastToLong(Inst *inst);
68     bool EmitRawBitcastFromInt(Inst *inst);
69     bool EmitRawBitcastFromLong(Inst *inst);
70     bool EmitStringGetCharsTlab(Inst *inst);
71     bool EmitStringHashCode(Inst *inst);
72     bool EmitWriteTlabStatsSafe(Inst *inst);
73     bool EmitExpandU8U16(Inst *inst);
74     bool EmitReverseHalfWords(Inst *inst);
75     bool EmitAtomicByteOr(Inst *inst);
76 
77 public:
78     llvm::Value *GetMappedValue(Inst *inst, DataType::Type type);
79     llvm::Value *GetInputValue(Inst *inst, size_t index, bool skipCoerce = false);
80     llvm::Value *GetInputValueFromConstant(ConstantInst *constant, DataType::Type pandaType);
81     template <typename T>
82     llvm::FunctionType *GetFunctionTypeForCall(T *inst);
83 
GetGraph()84     Graph *GetGraph() const
85     {
86         return graph_;
87     }
88 
GetFunc()89     llvm::Function *GetFunc()
90     {
91         return func_;
92     }
93 
GetBlocksToVisit()94     const ArenaVector<BasicBlock *> &GetBlocksToVisit() const override
95     {
96         return graph_->GetBlocksRPO();
97     }
98 
99 private:
100     // Initializers. BuildIr calls them
101     void BuildBasicBlocks(Marker normal);
102     void BuildInstructions(Marker normal);
103     void FillPhiInputs(BasicBlock *block, Marker normal);
104 
105     // Creator functions for internal usage
106 
107     llvm::CallInst *CreateEntrypointCall(RuntimeInterface::EntrypointId eid, Inst *inst,
108                                          llvm::ArrayRef<llvm::Value *> args = llvm::None);
109     llvm::CallInst *CreateIntrinsicCall(Inst *inst);
110     llvm::CallInst *CreateIntrinsicCall(Inst *inst, RuntimeInterface::IntrinsicId entryId,
111                                         llvm::ArrayRef<llvm::Value *> arguments);
112     llvm::Value *CreateAllocaForArgs(llvm::Type *type, uint32_t arraySize);
113     llvm::CallInst *CreateFastPathCall(Inst *inst, RuntimeInterface::EntrypointId eid,
114                                        llvm::ArrayRef<llvm::Value *> args = llvm::None);
115 
116     llvm::Value *CreateIsInstanceEntrypointCall(Inst *inst);
117     llvm::Value *CreateIsInstanceObject(llvm::Value *klassObj);
118     llvm::Value *CreateIsInstanceOther(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
119     llvm::Value *CreateIsInstanceArray(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
120     llvm::Value *CreateIsInstanceArrayObject(Inst *inst, llvm::Value *klassObj);
121     llvm::Value *CreateIsInstanceInnerBlock(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
122 
123     void CreateCheckCastEntrypointCall(Inst *inst);
124     void CreateCheckCastObject(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
125     void CreateCheckCastOther(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
126     void CreateCheckCastArray(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
127     void CreateCheckCastArrayObject(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
128     void CreateCheckCastInner(Inst *inst, llvm::Value *klassObj, llvm::Value *klassId);
129 
130     void CreateInterpreterReturnRestoreRegs(RegMask &regMask, size_t offset, bool fp);
131     llvm::Value *CreateLoadClassById(Inst *inst, uint32_t typeId, bool init);
132     llvm::Value *CreateBinaryOp(Inst *inst, llvm::Instruction::BinaryOps opcode);
133     llvm::Value *CreateBinaryImmOp(Inst *inst, llvm::Instruction::BinaryOps opcode, uint64_t c);
134     llvm::Value *CreateShiftOp(Inst *inst, llvm::Instruction::BinaryOps opcode);
135     llvm::Value *CreateSignDivMod(Inst *inst, llvm::Instruction::BinaryOps opcode);
136     llvm::Value *CreateFloatComparison(CmpInst *cmpInst, llvm::Value *x, llvm::Value *y);
137     llvm::Value *CreateIntegerComparison(CmpInst *inst, llvm::Value *x, llvm::Value *y);
138     llvm::Value *CreateNewArrayWithRuntime(Inst *inst);
139     llvm::Value *CreateNewObjectWithRuntime(Inst *inst);
140     llvm::Value *CreateResolveVirtualCallBuiltin(Inst *inst, llvm::Value *thiz, uint32_t methodId);
141     llvm::Value *CreateLoadManagedClassFromClass(llvm::Value *klass);
CreateIsNan(llvm::Value * value)142     llvm::Value *CreateIsNan(llvm::Value *value)
143     {
144         return builder_.CreateFCmp(llvm::FCmpInst::Predicate::FCMP_UNE, value, value);
145     }
146 
147     llvm::Value *CreateIsInf(llvm::Value *input);
148     llvm::Value *CreateIsInteger(Inst *inst, llvm::Value *input);
149     llvm::Value *CreateCastToInt(Inst *inst);
150     llvm::Value *CreateLoadWithOrdering(Inst *inst, llvm::Value *value, llvm::AtomicOrdering ordering,
151                                         const llvm::Twine &name = "");
152     llvm::Value *CreateStoreWithOrdering(llvm::Value *value, llvm::Value *ptr, llvm::AtomicOrdering ordering);
153     llvm::Value *CreateZerosCount(Inst *inst, llvm::Intrinsic::ID llvmId);
154     llvm::Value *CreateRoundArm64(Inst *inst, bool is64);
155     llvm::Value *CreateNewStringFromCharsTlab(Inst *inst, llvm::Value *offset, llvm::Value *length, llvm::Value *array);
156     llvm::Value *CreateNewStringFromStringTlab(Inst *inst, llvm::Value *stringVal);
157     llvm::Value *CreateLaunchArgsArray(CallInst *callInst, uint32_t argStart);
158     void CreateLaunchCall([[maybe_unused]] CallInst *callInst);
159     void CreateDeoptimizationBranch(Inst *inst, llvm::Value *deoptimize, RuntimeInterface::EntrypointId exception,
160                                     llvm::ArrayRef<llvm::Value *> arguments = llvm::None);
161     ArenaVector<llvm::OperandBundleDef> CreateSaveStateBundle(Inst *inst, bool noReturn = false);
162     void EncodeSaveStateInputs(ArenaVector<llvm::Value *> *vals, SaveStateInst *ss);
163     void EncodeInlineInfo(Inst *inst, llvm::Instruction *instruction);
164     void CreatePreWRB(Inst *inst, llvm::Value *mem);
165     void CreatePostWRB(Inst *inst, llvm::Value *mem, llvm::Value *offset, llvm::Value *value);
166     llvm::Value *CreateMemoryFence(memory_order::Order order);
167     llvm::Value *CreateCondition(ConditionCode cc, llvm::Value *x, llvm::Value *y);
168     void CreateIf(Inst *inst, llvm::Value *cond, bool likely, bool unlikely);
169     llvm::CallInst *CreateTailCallFastPath(Inst *inst);
170     llvm::CallInst *CreateTailCallInterpreter(Inst *inst);
171     template <uint32_t VECTOR_SIZE>
172     void CreateCompressUtf16ToUtf8CharsUsingSimd(Inst *inst);
173 
174     // Getters
175     llvm::FunctionType *GetEntryFunctionType();
176 
GetEntrypointSizeType()177     llvm::IntegerType *GetEntrypointSizeType()
178     {
179         return builder_.getIntNTy(func_->getParent()->getDataLayout().getPointerSizeInBits(0));
180     }
181 
182     llvm::Value *ToSizeT(llvm::Value *value);
183     llvm::Value *ToSSizeT(llvm::Value *value);
184 
185     ArenaVector<llvm::Value *> GetArgumentsForCall(llvm::Value *callee, CallInst *call, bool skipFirst = false);
186     ArenaVector<llvm::Value *> GetIntrinsicArguments(llvm::FunctionType *intrinsicFunctionType, IntrinsicInst *inst);
187     void SetIntrinsicParamAttrs(llvm::CallInst *call, IntrinsicInst *inst, llvm::ArrayRef<llvm::Value *> args);
188 
189     llvm::Value *GetThreadRegValue();
190     llvm::Value *GetRealFrameRegValue();
191 
GetMethodArgument()192     llvm::Argument *GetMethodArgument()
193     {
194         ASSERT(func_ != nullptr);
195         ASSERT(GetGraph()->SupportManagedCode());
196         auto offset = 0;
197         return func_->arg_begin() + offset;
198     }
199 
GetArgument(size_t index)200     llvm::Argument *GetArgument(size_t index)
201     {
202         ASSERT(func_ != nullptr);
203         auto offset = 0;
204         if (GetGraph()->SupportManagedCode()) {
205             offset++;
206         }
207         return func_->arg_begin() + offset + index;
208     }
209 
210     llvm::Function *GetOrCreateFunctionForCall(ark::compiler::CallInst *call, void *method);
211 
212     llvm::Type *GetType(DataType::Type pandaType);
213     llvm::Type *GetExactType(DataType::Type targetType);
214 
215     llvm::Instruction::CastOps GetCastOp(DataType::Type from, DataType::Type to);
216 
217     llvm::Value *CoerceValue(llvm::Value *value, DataType::Type sourceType, DataType::Type targetType);
218     llvm::Value *CoerceValue(llvm::Value *value, llvm::Type *targetType);
219 
220     void ValueMapAdd(Inst *inst, llvm::Value *value, bool setName = true);
221     void FillValueMapForUsers(ArenaUnorderedMap<DataType::Type, llvm::Value *> *map, Inst *inst, llvm::Value *value);
222 
223     void WrapArkCall(Inst *orig, llvm::CallInst *call);
224 
AddBlock(BasicBlock * pb,llvm::BasicBlock * lb)225     void AddBlock(BasicBlock *pb, llvm::BasicBlock *lb)
226     {
227         ASSERT(blockTailMap_.count(pb) == 0);
228         blockTailMap_.insert({pb, lb});
229         blockHeadMap_.insert({pb, lb});
230     }
231 
SetCurrentBasicBlock(llvm::BasicBlock * block)232     void SetCurrentBasicBlock(llvm::BasicBlock *block)
233     {
234         builder_.SetInsertPoint(block);
235     }
236 
GetCurrentBasicBlock()237     llvm::BasicBlock *GetCurrentBasicBlock()
238     {
239         return builder_.GetInsertBlock();
240     }
241 
ReplaceTailBlock(BasicBlock * pandaBlock,llvm::BasicBlock * llvmBlock)242     void ReplaceTailBlock(BasicBlock *pandaBlock, llvm::BasicBlock *llvmBlock)
243     {
244         auto it = blockTailMap_.find(pandaBlock);
245         ASSERT(it != blockTailMap_.end());
246         it->second = llvmBlock;
247     }
248 
GetHeadBlock(BasicBlock * block)249     llvm::BasicBlock *GetHeadBlock(BasicBlock *block)
250     {
251         ASSERT(blockHeadMap_.count(block) == 1);
252         auto result = blockHeadMap_.at(block);
253         ASSERT(result != nullptr);
254         return result;
255     }
256 
GetTailBlock(BasicBlock * block)257     llvm::BasicBlock *GetTailBlock(BasicBlock *block)
258     {
259         ASSERT(blockTailMap_.count(block) == 1);
260         auto result = blockTailMap_.at(block);
261         ASSERT(result != nullptr);
262         return result;
263     }
264 
265     void InitializeEntryBlock(bool noInline);
266 
267     void MarkAsAllocation(llvm::CallInst *call);
268 
269 protected:
270     // Instruction Visitors
271 
272     static void VisitConstant(GraphVisitor *v, Inst *inst);
273     static void VisitNullPtr(GraphVisitor *v, Inst *inst);
274     static void VisitLiveIn(GraphVisitor *v, Inst *inst);
275     static void VisitParameter(GraphVisitor *v, Inst *inst);
276     static void VisitReturnVoid(GraphVisitor *v, Inst *inst);
277     static void VisitReturn(GraphVisitor *v, Inst *inst);
278     static void VisitReturnInlined(GraphVisitor *v, Inst *inst);
279     static void VisitReturnI(GraphVisitor *v, Inst *inst);
280     static void VisitTry(GraphVisitor *v, Inst *inst);
281     static void VisitSaveState(GraphVisitor *v, Inst *inst);
282     static void VisitSaveStateDeoptimize(GraphVisitor *v, Inst *inst);
283     static void VisitSafePoint(GraphVisitor *v, Inst *inst);
284     static void VisitNOP(GraphVisitor *v, Inst *inst);
285     static void VisitLiveOut(GraphVisitor *v, Inst *inst);
286     static void VisitSubOverflowCheck(GraphVisitor *v, Inst *inst);
287     static void VisitDeoptimize(GraphVisitor *v, Inst *inst);
288     static void VisitDeoptimizeIf(GraphVisitor *v, Inst *inst);
289     static void VisitNegativeCheck(GraphVisitor *v, Inst *inst);
290     static void VisitZeroCheck(GraphVisitor *v, Inst *inst);
291     static void VisitNullCheck(GraphVisitor *v, Inst *inst);
292     static void VisitBoundsCheck(GraphVisitor *v, Inst *inst);
293     static void VisitRefTypeCheck(GraphVisitor *v, Inst *inst);
294     static void VisitLoadString(GraphVisitor *v, Inst *inst);
295     static void VisitLenArray(GraphVisitor *v, Inst *inst);
296     static void VisitLoadArray(GraphVisitor *v, Inst *inst);
297     static void VisitLoadCompressedStringChar(GraphVisitor *v, Inst *inst);
298     static void VisitStoreArray(GraphVisitor *v, Inst *inst);
299     static void VisitLoad(GraphVisitor *v, Inst *inst);
300     static void VisitStore(GraphVisitor *v, Inst *inst);
301     static void VisitLoadI(GraphVisitor *v, Inst *inst);
302     static void VisitStoreI(GraphVisitor *v, Inst *inst);
303     static void VisitLoadObject(GraphVisitor *v, Inst *inst);
304     static void VisitStoreObject(GraphVisitor *v, Inst *inst);
305     static void VisitResolveObjectField(GraphVisitor *v, Inst *inst);
306     static void VisitLoadResolvedObjectField(GraphVisitor *v, Inst *inst);
307     static void VisitStoreResolvedObjectField(GraphVisitor *v, Inst *inst);
308     static void VisitResolveObjectFieldStatic(GraphVisitor *v, Inst *inst);
309     static void VisitLoadResolvedObjectFieldStatic(GraphVisitor *v, Inst *inst);
310     static void VisitStoreResolvedObjectFieldStatic(GraphVisitor *v, Inst *inst);
311     static void VisitBitcast(GraphVisitor *v, Inst *inst);
312     static void VisitCast(GraphVisitor *v, Inst *inst);
313     static void VisitAnd(GraphVisitor *v, Inst *inst);
314     static void VisitAndI(GraphVisitor *v, Inst *inst);
315     static void VisitOr(GraphVisitor *v, Inst *inst);
316     static void VisitOrI(GraphVisitor *v, Inst *inst);
317     static void VisitXor(GraphVisitor *v, Inst *inst);
318     static void VisitXorI(GraphVisitor *v, Inst *inst);
319     static void VisitShl(GraphVisitor *v, Inst *inst);
320     static void VisitShlI(GraphVisitor *v, Inst *inst);
321     static void VisitShr(GraphVisitor *v, Inst *inst);
322     static void VisitShrI(GraphVisitor *v, Inst *inst);
323     static void VisitAShr(GraphVisitor *v, Inst *inst);
324     static void VisitAShrI(GraphVisitor *v, Inst *inst);
325     static void VisitAdd(GraphVisitor *v, Inst *inst);
326     static void VisitAddI(GraphVisitor *v, Inst *inst);
327     static void VisitSub(GraphVisitor *v, Inst *inst);
328     static void VisitSubI(GraphVisitor *v, Inst *inst);
329     static void VisitMul(GraphVisitor *v, Inst *inst);
330     static void VisitMulI(GraphVisitor *v, Inst *inst);
331     static void VisitDiv(GraphVisitor *v, Inst *inst);
332     static void VisitMod(GraphVisitor *v, Inst *inst);
333     static void VisitMin(GraphVisitor *v, Inst *inst);
334     static void VisitMax(GraphVisitor *v, Inst *inst);
335     static void VisitCompare(GraphVisitor *v, Inst *inst);
336     static void VisitCmp(GraphVisitor *v, Inst *inst);
337     static void VisitNeg(GraphVisitor *v, Inst *inst);
338     static void VisitNot(GraphVisitor *v, Inst *inst);
339     static void VisitIfImm(GraphVisitor *v, Inst *inst);
340     static void VisitIf(GraphVisitor *v, Inst *inst);
341     static void VisitCallIndirect(GraphVisitor *v, Inst *inst);
342     static void VisitCall(GraphVisitor *v, Inst *inst);
343     static void VisitPhi(GraphVisitor *v, Inst *inst);
344     static void VisitMultiArray(GraphVisitor *v, Inst *inst);
345     static void VisitInitEmptyString(GraphVisitor *v, Inst *inst);
346     static void VisitInitString(GraphVisitor *v, Inst *inst);
347     static void VisitNewArray(GraphVisitor *v, Inst *inst);
348     static void VisitNewObject(GraphVisitor *v, Inst *inst);
349     static void VisitCallStatic(GraphVisitor *v, Inst *inst);
350     static void VisitResolveStatic(GraphVisitor *v, Inst *inst);
351     static void VisitCallResolvedStatic(GraphVisitor *v, Inst *inst);
352     static void VisitCallVirtual(GraphVisitor *v, Inst *inst);
353     static void VisitResolveVirtual(GraphVisitor *v, Inst *inst);
354     static void VisitCallResolvedVirtual(GraphVisitor *v, Inst *inst);
355     static void VisitAbs(GraphVisitor *v, Inst *inst);
356     static void VisitIntrinsic(GraphVisitor *v, Inst *inst);
357     static void VisitMonitor(GraphVisitor *v, Inst *inst);
358     static void VisitSqrt(GraphVisitor *v, Inst *inst);
359     static void VisitInitClass(GraphVisitor *v, Inst *inst);
360     static void VisitLoadClass(GraphVisitor *v, Inst *inst);
361     static void VisitLoadAndInitClass(GraphVisitor *v, Inst *inst);
362     static void VisitUnresolvedLoadAndInitClass(GraphVisitor *v, Inst *inst);
363     static void VisitLoadStatic(GraphVisitor *v, Inst *inst);
364     static void VisitStoreStatic(GraphVisitor *v, Inst *inst);
365     static void VisitUnresolvedStoreStatic(GraphVisitor *v, Inst *inst);
366     static void VisitLoadConstArray(GraphVisitor *v, Inst *inst);
367     static void VisitFillConstArray(GraphVisitor *v, Inst *inst);
368     static void VisitIsInstance(GraphVisitor *v, Inst *inst);
369     static void VisitCheckCast(GraphVisitor *v, Inst *inst);
370     static void VisitLoadType(GraphVisitor *v, Inst *inst);
371     static void VisitUnresolvedLoadType(GraphVisitor *v, Inst *inst);
372     static void VisitGetInstanceClass(GraphVisitor *v, Inst *inst);
373     static void VisitThrow(GraphVisitor *v, Inst *inst);
374     static void VisitCatchPhi(GraphVisitor *v, Inst *inst);
375     static void VisitLoadRuntimeClass(GraphVisitor *v, Inst *inst);
376     static void VisitLoadUndefined(GraphVisitor *v, Inst *inst);
377     static void VisitCallLaunchVirtual(GraphVisitor *v, Inst *inst);
378     static void VisitCallResolvedLaunchStatic(GraphVisitor *v, Inst *inst);
379     static void VisitCallResolvedLaunchVirtual(GraphVisitor *v, Inst *inst);
380     static void VisitLoadImmediate(GraphVisitor *v, Inst *inst);
381 
382     void VisitDefault(Inst *inst) override;
383 
384 public:
385     explicit LLVMIrConstructor(Graph *graph, llvm::Module *module, llvm::LLVMContext *context,
386                                llvmbackend::LLVMArkInterface *arkInterface,
387                                const std::unique_ptr<llvmbackend::DebugDataBuilder> &debugData);
388 
389     bool BuildIr(bool preventInlining);
390 
391     static void InsertArkFrameInfo(llvm::Module *module, Arch arch);
392     static void ProvideSafepointPoll(llvm::Module *module, llvmbackend::LLVMArkInterface *arkInterface, Arch arch);
393 
394     static std::string CheckGraph(Graph *graph);
395     static bool CanCompile(Inst *inst);
396 
397 #ifndef NDEBUG
398     void BreakIrIfNecessary();
399 #endif
400 
401 #include "llvm_ir_constructor_gen.h.inl"
402 
403 #include "optimizer/ir/visitor.inc"
404 
405 private:
406     Graph *graph_ {nullptr};
407     llvm::Function *func_;
408     llvm::IRBuilder<> builder_;
409     ArenaDoubleUnorderedMap<Inst *, DataType::Type, llvm::Value *> inputMap_;
410     ArenaUnorderedMap<BasicBlock *, llvm::BasicBlock *> blockTailMap_;
411     ArenaUnorderedMap<BasicBlock *, llvm::BasicBlock *> blockHeadMap_;
412     llvmbackend::LLVMArkInterface *arkInterface_;
413     const std::unique_ptr<llvmbackend::DebugDataBuilder> &debugData_;
414     ArenaVector<uint8_t> cc_;
415     ArenaVector<llvm::Value *> ccValues_;
416 };
417 
418 }  // namespace ark::compiler
419 
420 #endif  // LIBLLVMBACKEND_LOWERING_LLVM_IR_CONSTRUCTOR_H
421