IndexedAbstractHeap::IndexedAbstractHeap(LContext context, AbstractHeap* parent, const char* heapName, ptrdiff_t offset, size_t elementSize) : m_heapForAnyIndex(parent, heapName) , m_heapNameLength(strlen(heapName)) , m_offset(offset) , m_elementSize(elementSize) , m_scaleTerm(0) , m_canShift(false) { #if FTL_USES_B3 UNUSED_PARAM(context); #else // See if there is a common shift amount we could use instead of multiplying. Don't // try too hard. This is just a speculative optimization to reduce load on LLVM. for (unsigned i = 0; i < 4; ++i) { if (1U << i == m_elementSize) { if (i) m_scaleTerm = constInt(intPtrType(context), i, ZeroExtend); m_canShift = true; break; } } if (!m_canShift) m_scaleTerm = constInt(intPtrType(context), m_elementSize, ZeroExtend); #endif }
llvm::MDNode * localVariableInfo(llvm::LLVMContext & ctx, llvm::MDNode * context, const char * name, llvm::MDNode * file, int lineNumber, llvm::MDNode * type) { std::vector<llvm::Value *> values; values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_auto_variable)); // Tag values.push_back(context); values.push_back(llvm::MDString::get(ctx, name)); values.push_back(file); values.push_back(constInt(ctx, lineNumber)); values.push_back(type); return llvm::MDNode::get(ctx, values); }
TEST_F(OneSubOptimizerTests, EqOpAndXorOpSecOpOfXorIsTenNotOptimized) { // return (a == b) ^ 10; // // Not optimized. // ShPtr<Variable> varA(Variable::create("a", IntType::create(16, true))); ShPtr<Variable> varB(Variable::create("b", IntType::create(16, true))); ShPtr<ConstInt> constInt(ConstInt::create(10, 64)); ShPtr<EqOpExpr> eqOpExpr( EqOpExpr::create( varA, varB )); ShPtr<BitXorOpExpr> returnExpr( BitXorOpExpr::create( eqOpExpr, constInt )); ShPtr<ReturnStmt> returnStmt(ReturnStmt::create(returnExpr)); optimizer->tryOptimize(returnStmt->getRetVal()); ShPtr<BitXorOpExpr> outBitXorOpExpr(cast<BitXorOpExpr>(returnStmt->getRetVal())); ASSERT_TRUE(outBitXorOpExpr) << "expected `BitXorOpExpr`, " "got `" << returnStmt->getRetVal() << "`"; ShPtr<EqOpExpr> outEqOpExpr(cast<EqOpExpr>(outBitXorOpExpr->getFirstOperand())); ASSERT_TRUE(outEqOpExpr) << "expected `EqOpExpr`, " "got `" << outBitXorOpExpr->getFirstOperand() << "`"; ShPtr<Variable> outOp1(cast<Variable>(outEqOpExpr->getFirstOperand())); ASSERT_TRUE(outOp1) << "expected `Variable`, " "got `" << outEqOpExpr->getFirstOperand() << "`"; EXPECT_EQ(varA, outOp1) << "expected `" << varA << "`, " "got `" << outOp1 << "`"; ShPtr<Variable> outOp2(cast<Variable>(outEqOpExpr->getSecondOperand())); ASSERT_TRUE(outOp2) << "expected `Variable`, " "got `" << outEqOpExpr->getSecondOperand() << "`"; EXPECT_EQ(varB, outOp2) << "expected `" << varB << "`, " "got `" << outOp2 << "`"; ShPtr<ConstInt> outConstInt(cast<ConstInt>(outBitXorOpExpr->getSecondOperand())); ASSERT_TRUE(outConstInt) << "expected `ConstInt`, " "got `" << outBitXorOpExpr->getSecondOperand() << "`"; EXPECT_EQ(constInt, outConstInt) << "expected `" << constInt << "`, " "got `" << outConstInt << "`"; }
llvm::MDNode * fileInfo(llvm::LLVMContext & ctx, const char * fileName, const char * fileDirectory, llvm::MDNode * compilationUnit) { std::vector<llvm::Value *> values; values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_file_type)); // Tag values.push_back(llvm::MDString::get(ctx, fileName)); values.push_back(llvm::MDString::get(ctx, fileDirectory)); values.push_back(compilationUnit); return llvm::MDNode::get(ctx, values); }
llvm::MDNode * subprogramInfo(llvm::LLVMContext & ctx, llvm::MDNode * context, const char * name, const char * displayName, const char * MIPSLinkName, llvm::MDNode * file, int lineNumber, llvm::MDNode * type, bool isStatic, bool notExtern, int virtuality, int virtualIndex, llvm::MDNode * vtableType, bool artificial, bool optimized, llvm::Function * const function) { std::vector<llvm::Value *> values; values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_subprogram)); // Tag values.push_back(constInt(ctx, 0)); // Unused values.push_back(context); values.push_back(llvm::MDString::get(ctx, name)); values.push_back(llvm::MDString::get(ctx, displayName)); values.push_back(llvm::MDString::get(ctx, MIPSLinkName)); values.push_back(file); values.push_back(constInt(ctx, lineNumber)); values.push_back(type); values.push_back(constBit(ctx, isStatic)); values.push_back(constBit(ctx, notExtern)); values.push_back(constInt(ctx, virtuality)); values.push_back(constInt(ctx, virtualIndex)); values.push_back(vtableType); values.push_back(constBit(ctx, artificial)); values.push_back(constBit(ctx, optimized)); values.push_back((llvm::Value *)function); return llvm::MDNode::get(ctx, values); }
llvm::MDNode * compilationUnitInfo(llvm::LLVMContext & ctx, int languageId, const char * sourceName, const char * sourceDirectory, const char * producer, bool mainCompileUnit, bool optimized, const char * flags, int runtimeVersion) { std::vector<llvm::Value *> values; values.push_back(constInt(ctx, llvm::LLVMDebugVersion + llvm::dwarf::DW_TAG_compile_unit)); // Tag values.push_back(constInt(ctx, 0)); // Unused values.push_back(constInt(ctx, languageId)); values.push_back(llvm::MDString::get(ctx, sourceName)); values.push_back(llvm::MDString::get(ctx, sourceDirectory)); values.push_back(llvm::MDString::get(ctx, producer)); values.push_back(constBit(ctx, mainCompileUnit)); values.push_back(constBit(ctx, optimized)); values.push_back(llvm::MDString::get(ctx, flags)); values.push_back(constInt(ctx, runtimeVersion)); return llvm::MDNode::get(ctx, values); }
CommonValues::CommonValues(LContext context) : voidType(FTL::voidType(context)) , boolean(int1Type(context)) , int8(int8Type(context)) , int16(int16Type(context)) , int32(int32Type(context)) , int64(int64Type(context)) , intPtr(intPtrType(context)) , floatType(FTL::floatType(context)) , doubleType(FTL::doubleType(context)) , ref8(pointerType(int8)) , ref16(pointerType(int16)) , ref32(pointerType(int32)) , ref64(pointerType(int64)) , refPtr(pointerType(intPtr)) , refFloat(pointerType(floatType)) , refDouble(pointerType(doubleType)) , booleanTrue(constInt(boolean, true, ZeroExtend)) , booleanFalse(constInt(boolean, false, ZeroExtend)) , int8Zero(constInt(int8, 0, SignExtend)) , int32Zero(constInt(int32, 0, SignExtend)) , int32One(constInt(int32, 1, SignExtend)) , int64Zero(constInt(int64, 0, SignExtend)) , intPtrZero(constInt(intPtr, 0, SignExtend)) , intPtrOne(constInt(intPtr, 1, SignExtend)) , intPtrTwo(constInt(intPtr, 2, SignExtend)) , intPtrThree(constInt(intPtr, 3, SignExtend)) , intPtrFour(constInt(intPtr, 4, SignExtend)) , intPtrEight(constInt(intPtr, 8, SignExtend)) , intPtrPtr(constInt(intPtr, sizeof(void*), SignExtend)) , doubleZero(constReal(doubleType, 0)) , rangeKind(mdKindID(context, "range")) , profKind(mdKindID(context, "prof")) , branchWeights(mdString(context, "branch_weights")) , nonNegativeInt32(constInt(int32, 0, SignExtend), constInt(int32, 1ll << 31, SignExtend)) , m_context(context) , m_module(0) { }