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 ®Mask, 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