@ -10,10 +10,9 @@
# include <sstream>
# include <string>
# include <vector>
using namespace std ;
# include "SysYIRGenerator.h"
using namespace std ;
namespace sysy {
/*
@ -130,30 +129,111 @@ std::any SysYIRGenerator::visitVarDecl(SysYParser::VarDeclContext *ctx) {
delete root ;
if ( dims . empty ( ) ) {
builder . createStoreInst ( values . getValue ( 0 ) , alloca ) ;
} else {
// 对于多维数组, 使用memset 初始化
// 计算每个维度的大小
// 这里的values.getNumbers()返回的是每个维度的大小
// 这里的values.getValues()返回的是每个维度对应的值
// 例如: 对于一个二维数组, values.getNumbers()可能是[3, 4], 表示3行4列
// values.getValues()可能是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
// 对于每个维度, 使用memset将对应的值填充到数组中
// 这里的alloca是一个指向数组的指针
const std : : vector < unsigned int > & counterNumb ers = values . getNumbers ( ) ;
const std : : vector < sysy : : Value * > & counterValues = values . getValues ( ) ;
unsigned begin = 0 ;
for ( size_t i = 0 ; i < counterNumbers . size ( ) ; i + + ) {
} else {
// **数组变量 初始化**
const std : : vector < sysy : : Value * > & counterValues = values . getValues ( ) ;
// 计算数组的**总元素数量**和**总字节大小**
int numElements = 1 ;
// 存储每个维度的实际整数大小,用于索引计算
std : : vector < int > dimSizes ;
for ( Value * dimVal : dims ) {
if ( ConstantInteger * constInt = dynamic_cast < ConstantInteg er * > ( dimVal ) ) {
int dimSize = constInt - > getInt ( ) ;
numElements * = dimSize ;
dimSizes . push_back ( dimSize ) ;
}
// TODO else 错误处理:数组维度必须是常量(对于静态分配)
}
unsigned int elementSizeInBytes = type - > getSize ( ) ; // 获取单个元素的大小(字节)
unsigned int totalSizeInBytes = numElements * elementSizeInBytes ;
// **判断是否可以进行全零初始化优化**
bool allValuesAreZero = false ;
if ( counterValues . empty ( ) ) { // 例如 int arr[3] = {}; 或 int arr[3][4] = {};
allValuesAreZero = true ;
}
else {
allValuesAreZero = true ;
for ( Value * val : counterValues ) {
if ( ConstantInteger * constInt = dynamic_cast < ConstantInteger * > ( val ) ) {
if ( constInt - > getInt ( ) ! = 0 ) {
allValuesAreZero = false ;
break ;
}
}
else {
// 如果值不是常量,我们通常不能确定它是否为零,所以不进行 memset 优化
allValuesAreZero = false ;
break ;
}
}
}
if ( allValuesAreZero ) {
// 如果所有初始化值都是零(或没有明确初始化但语法允许),使用 memset 优化
builder . createMemsetInst (
alloca , ConstantValue : : get ( static_cast < int > ( begin ) ) ,
ConstantValue : : get ( static_cast < int > ( counterNumbers [ i ] ) ) ,
counterValues [ i ] ) ;
begin + = counterNumbers [ i ] ;
alloca , // 目标数组的起始地址
ConstantInteger : : get ( 0 ) , // 偏移量( 通常为0) , 后续删除
ConstantInteger : : get ( totalSizeInBytes ) ,
ConstantInteger : : get ( 0 ) ) ; // 填充的总字节数
}
else {
// **逐元素存储:遍历所有初始值,并为每个值生成一个 store 指令**
for ( size_t k = 0 ; k < counterValues . size ( ) ; + + k ) {
// 用于存储当前元素的索引列表
std : : vector < Value * > currentIndices ;
int tempLinearIndex = k ; // 临时线性索引,用于计算多维索引
// **将线性索引转换为多维索引**
// 这个循环从最内层维度开始倒推,计算每个维度的索引
// 假设是行主序( row-major order) , 这是 C/C++ 数组的标准存储方式
for ( int dimIdx = dimSizes . size ( ) - 1 ; dimIdx > = 0 ; - - dimIdx )
{
// 计算当前维度的索引,并插入到列表的最前面
currentIndices . insert ( currentIndices . begin ( ) ,
ConstantInteger : : get ( static_cast < int > ( tempLinearIndex % dimSizes [ dimIdx ] ) ) ) ;
// 更新线性索引,用于计算下一个更高维度的索引
tempLinearIndex / = dimSizes [ dimIdx ] ;
}
// **生成 store 指令,传入值、基指针和计算出的索引列表**
// 你的 builder.createStoreInst 签名需要能够接受这些参数
// 假设你的 builder.createStoreInst(Value *val, Value *ptr, const std::vector<Value *> &indices, ...)
builder . createStoreInst ( counterValues [ k ] , alloca , currentIndices ) ;
}
}
}
}
else
{ // **如果没有显式初始化值,默认对数组进行零初始化**
if ( ! dims . empty ( ) )
{ // 只有数组才需要默认的零初始化
int numElements = 1 ;
for ( Value * dimVal : dims )
{
if ( ConstantInteger * constInt = dynamic_cast < ConstantInteger * > ( dimVal ) )
{
numElements * = constInt - > getInt ( ) ;
}
}
unsigned int elementSizeInBytes = type - > getSize ( ) ;
unsigned int totalSizeInBytes = numElements * elementSizeInBytes ;
// 使用 memset 将整个数组清零
builder . createMemsetInst (
alloca ,
ConstantInteger : : get ( 0 ) ,
ConstantInteger : : get ( totalSizeInBytes ) ,
ConstantInteger : : get ( 0 )
) ; // 填充的总字节数
}
// 标量变量如果没有初始化值,通常不生成额外的初始化指令,因为其内存已分配但未赋值。
}
module - > addVariable ( name , alloca ) ;
}
return std : : any ( ) ;
}
@ -218,7 +298,7 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){
paramNames . push_back ( param - > Ident ( ) - > getText ( ) ) ;
std : : vector < Value * > dims = { } ;
if ( ! param - > LBRACK ( ) . empty ( ) ) {
dims . push_back ( ConstantValue : : get ( - 1 ) ) ; // 第一个维度不确定
dims . push_back ( ConstantInteger : : get ( - 1 ) ) ; // 第一个维度不确定
for ( const auto & exp : param - > exp ( ) ) {
dims . push_back ( std : : any_cast < Value * > ( visitExp ( exp ) ) ) ;
}
@ -247,9 +327,9 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){
if ( HasReturnInst = = false ) {
// 如果没有return语句, 则默认返回0
if ( returnType ! = Type : : getVoidType ( ) ) {
Value * returnValue = ConstantValue : : get ( 0 ) ;
Value * returnValue = ConstantInteger : : get ( 0 ) ;
if ( returnType = = Type : : getFloatType ( ) ) {
returnValue = ConstantValue : : get ( 0.0f ) ;
returnValue = ConstantFloating : : get ( 0.0f ) ;
}
builder . createReturnInst ( returnValue ) ;
} else {
@ -286,9 +366,9 @@ std::any SysYIRGenerator::visitAssignStmt(SysYParser::AssignStmtContext *ctx) {
ConstantValue * constValue = dynamic_cast < ConstantValue * > ( value ) ;
if ( constValue ! = nullptr ) {
if ( variableType = = Type : : getFloatType ( ) ) {
value = ConstantValue : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
value = ConstantInteger : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
} else {
value = ConstantValue : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ;
value = ConstantFloating : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ;
}
} else {
if ( variableType = = Type : : getFloatType ( ) ) {
@ -478,9 +558,9 @@ std::any SysYIRGenerator::visitReturnStmt(SysYParser::ReturnStmtContext *ctx) {
ConstantValue * constValue = dynamic_cast < ConstantValue * > ( returnValue ) ;
if ( constValue ! = nullptr ) {
if ( funcType = = Type : : getFloatType ( ) ) {
returnValue = ConstantValue : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
returnValue = ConstantInteger : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
} else {
returnValue = ConstantValue : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ;
returnValue = ConstantFloating : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ;
}
} else {
if ( funcType = = Type : : getFloatType ( ) ) {
@ -560,10 +640,10 @@ std::any SysYIRGenerator::visitPrimaryExp(SysYParser::PrimaryExpContext *ctx) {
std : : any SysYIRGenerator : : visitNumber ( SysYParser : : NumberContext * ctx ) {
if ( ctx - > ILITERAL ( ) ! = nullptr ) {
int value = std : : stol ( ctx - > ILITERAL ( ) - > getText ( ) , nullptr , 0 ) ;
return static_cast < Value * > ( ConstantValue : : get ( value ) ) ;
return static_cast < Value * > ( ConstantInteger : : get ( value ) ) ;
} else if ( ctx - > FLITERAL ( ) ! = nullptr ) {
float value = std : : stof ( ctx - > FLITERAL ( ) - > getText ( ) ) ;
return static_cast < Value * > ( ConstantValue : : get ( value ) ) ;
return static_cast < Value * > ( ConstantFloating : : get ( value ) ) ;
}
throw std : : runtime_error ( " Unknown number type. " ) ;
return std : : any ( ) ; // 不会到达这里
@ -599,9 +679,9 @@ std::any SysYIRGenerator::visitCall(SysYParser::CallContext *ctx) {
ConstantValue * constValue = dynamic_cast < ConstantValue * > ( args [ i ] ) ;
if ( constValue ! = nullptr ) {
if ( params [ i ] - > getType ( ) = = Type : : getPointerType ( Type : : getFloatType ( ) ) ) {
args [ i ] = ConstantValue : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
args [ i ] = ConstantInteger : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
} else {
args [ i ] = ConstantValue : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ;
args [ i ] = ConstantFloating : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ;
}
} else {
if ( params [ i ] - > getType ( ) = = Type : : getPointerType ( Type : : getFloatType ( ) ) ) {
@ -629,9 +709,9 @@ std::any SysYIRGenerator::visitUnaryExp(SysYParser::UnaryExpContext *ctx) {
ConstantValue * constValue = dynamic_cast < ConstantValue * > ( value ) ;
if ( constValue ! = nullptr ) {
if ( constValue - > isFloat ( ) ) {
result = ConstantValue : : get ( - constValue - > getFloat ( ) ) ;
result = ConstantFloating : : get ( - constValue - > getFloat ( ) ) ;
} else {
result = ConstantValue : : get ( - constValue - > getInt ( ) ) ;
result = ConstantInteger : : get ( - constValue - > getInt ( ) ) ;
}
} else if ( value ! = nullptr ) {
if ( value - > getType ( ) = = Type : : getIntType ( ) ) {
@ -648,9 +728,9 @@ std::any SysYIRGenerator::visitUnaryExp(SysYParser::UnaryExpContext *ctx) {
if ( constValue ! = nullptr ) {
if ( constValue - > isFloat ( ) ) {
result =
ConstantValue : : get ( 1 - ( constValue - > getFloat ( ) ! = 0.0F ? 1 : 0 ) ) ;
ConstantFloating : : get ( 1 - ( constValue - > getFloat ( ) ! = 0.0F ? 1 : 0 ) ) ;
} else {
result = ConstantValue : : get ( 1 - ( constValue - > getInt ( ) ! = 0 ? 1 : 0 ) ) ;
result = ConstantInteger : : get ( 1 - ( constValue - > getInt ( ) ! = 0 ? 1 : 0 ) ) ;
}
} else if ( value ! = nullptr ) {
if ( value - > getType ( ) = = Type : : getIntType ( ) ) {
@ -692,13 +772,13 @@ std::any SysYIRGenerator::visitMulExp(SysYParser::MulExpContext *ctx) {
if ( operandType ! = floatType ) {
ConstantValue * constValue = dynamic_cast < ConstantValue * > ( operand ) ;
if ( constValue ! = nullptr )
operand = ConstantValue : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
operand = ConstantFloating : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ;
else
operand = builder . createIToFInst ( operand ) ;
} else if ( resultType ! = floatType ) {
ConstantValue * constResult = dynamic_cast < ConstantValue * > ( result ) ;
if ( constResult ! = nullptr )
result = ConstantValue : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
result = ConstantFloating : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
else
result = builder . createIToFInst ( result ) ;
}
@ -707,14 +787,14 @@ std::any SysYIRGenerator::visitMulExp(SysYParser::MulExpContext *ctx) {
ConstantValue * constOperand = dynamic_cast < ConstantValue * > ( operand ) ;
if ( opType = = SysYParser : : MUL ) {
if ( ( constOperand ! = nullptr ) & & ( constResult ! = nullptr ) ) {
result = ConstantValue : : get ( constResult - > getFloat ( ) *
result = ConstantFloating : : get ( constResult - > getFloat ( ) *
constOperand - > getFloat ( ) ) ;
} else {
result = builder . createFMulInst ( result , operand ) ;
}
} else if ( opType = = SysYParser : : DIV ) {
if ( ( constOperand ! = nullptr ) & & ( constResult ! = nullptr ) ) {
result = ConstantValue : : get ( constResult - > getFloat ( ) /
result = ConstantFloating : : get ( constResult - > getFloat ( ) /
constOperand - > getFloat ( ) ) ;
} else {
result = builder . createFDivInst ( result , operand ) ;
@ -729,17 +809,17 @@ std::any SysYIRGenerator::visitMulExp(SysYParser::MulExpContext *ctx) {
ConstantValue * constOperand = dynamic_cast < ConstantValue * > ( operand ) ;
if ( opType = = SysYParser : : MUL ) {
if ( ( constOperand ! = nullptr ) & & ( constResult ! = nullptr ) )
result = ConstantValue : : get ( constResult - > getInt ( ) * constOperand - > getInt ( ) ) ;
result = ConstantInteger : : get ( constResult - > getInt ( ) * constOperand - > getInt ( ) ) ;
else
result = builder . createMulInst ( result , operand ) ;
} else if ( opType = = SysYParser : : DIV ) {
if ( ( constOperand ! = nullptr ) & & ( constResult ! = nullptr ) )
result = ConstantValue : : get ( constResult - > getInt ( ) / constOperand - > getInt ( ) ) ;
result = ConstantInteger : : get ( constResult - > getInt ( ) / constOperand - > getInt ( ) ) ;
else
result = builder . createDivInst ( result , operand ) ;
} else {
if ( ( constOperand ! = nullptr ) & & ( constResult ! = nullptr ) )
result = ConstantValue : : get ( constResult - > getInt ( ) % constOperand - > getInt ( ) ) ;
result = ConstantInteger : : get ( constResult - > getInt ( ) % constOperand - > getInt ( ) ) ;
else
result = builder . createRemInst ( result , operand ) ;
}
@ -767,13 +847,13 @@ std::any SysYIRGenerator::visitAddExp(SysYParser::AddExpContext *ctx) {
if ( operandType ! = floatType ) {
ConstantValue * constOperand = dynamic_cast < ConstantValue * > ( operand ) ;
if ( constOperand ! = nullptr )
operand = ConstantValue : : get ( static_cast < float > ( constOperand - > getInt ( ) ) ) ;
operand = ConstantFloating : : get ( static_cast < float > ( constOperand - > getInt ( ) ) ) ;
else
operand = builder . createIToFInst ( operand ) ;
} else if ( resultType ! = floatType ) {
ConstantValue * constResult = dynamic_cast < ConstantValue * > ( result ) ;
if ( constResult ! = nullptr )
result = ConstantValue : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
result = ConstantFloating : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
else
result = builder . createIToFInst ( result ) ;
}
@ -782,12 +862,12 @@ std::any SysYIRGenerator::visitAddExp(SysYParser::AddExpContext *ctx) {
ConstantValue * constOperand = dynamic_cast < ConstantValue * > ( operand ) ;
if ( opType = = SysYParser : : ADD ) {
if ( ( constResult ! = nullptr ) & & ( constOperand ! = nullptr ) )
result = ConstantValue : : get ( constResult - > getFloat ( ) + constOperand - > getFloat ( ) ) ;
result = ConstantFloating : : get ( constResult - > getFloat ( ) + constOperand - > getFloat ( ) ) ;
else
result = builder . createFAddInst ( result , operand ) ;
} else {
if ( ( constResult ! = nullptr ) & & ( constOperand ! = nullptr ) )
result = ConstantValue : : get ( constResult - > getFloat ( ) - constOperand - > getFloat ( ) ) ;
result = ConstantFloating : : get ( constResult - > getFloat ( ) - constOperand - > getFloat ( ) ) ;
else
result = builder . createFSubInst ( result , operand ) ;
}
@ -796,12 +876,12 @@ std::any SysYIRGenerator::visitAddExp(SysYParser::AddExpContext *ctx) {
ConstantValue * constOperand = dynamic_cast < ConstantValue * > ( operand ) ;
if ( opType = = SysYParser : : ADD ) {
if ( ( constResult ! = nullptr ) & & ( constOperand ! = nullptr ) )
result = ConstantValue : : get ( constResult - > getInt ( ) + constOperand - > getInt ( ) ) ;
result = ConstantInteger : : get ( constResult - > getInt ( ) + constOperand - > getInt ( ) ) ;
else
result = builder . createAddInst ( result , operand ) ;
} else {
if ( ( constResult ! = nullptr ) & & ( constOperand ! = nullptr ) )
result = ConstantValue : : get ( constResult - > getInt ( ) - constOperand - > getInt ( ) ) ;
result = ConstantInteger : : get ( constResult - > getInt ( ) - constOperand - > getInt ( ) ) ;
else
result = builder . createSubInst ( result , operand ) ;
}
@ -833,10 +913,10 @@ std::any SysYIRGenerator::visitRelExp(SysYParser::RelExpContext *ctx) {
auto operand2 = constOperand - > isFloat ( ) ? constOperand - > getFloat ( )
: constOperand - > getInt ( ) ;
if ( opType = = SysYParser : : LT ) result = ConstantValue : : get ( operand1 < operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : GT ) result = ConstantValue : : get ( operand1 > operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : LE ) result = ConstantValue : : get ( operand1 < = operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : GE ) result = ConstantValue : : get ( operand1 > = operand2 ? 1 : 0 ) ;
if ( opType = = SysYParser : : LT ) result = ConstantInteger : : get ( operand1 < operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : GT ) result = ConstantInteger : : get ( operand1 > operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : LE ) result = ConstantInteger : : get ( operand1 < = operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : GE ) result = ConstantInteger : : get ( operand1 > = operand2 ? 1 : 0 ) ;
else assert ( false ) ;
} else {
@ -848,14 +928,14 @@ std::any SysYIRGenerator::visitRelExp(SysYParser::RelExpContext *ctx) {
if ( resultType = = floatType | | operandType = = floatType ) {
if ( resultType ! = floatType ) {
if ( constResult ! = nullptr )
result = ConstantValue : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
result = ConstantFloating : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
else
result = builder . createIToFInst ( result ) ;
}
if ( operandType ! = floatType ) {
if ( constOperand ! = nullptr )
operand = ConstantValue : : get ( static_cast < float > ( constOperand - > getInt ( ) ) ) ;
operand = ConstantFloating : : get ( static_cast < float > ( constOperand - > getInt ( ) ) ) ;
else
operand = builder . createIToFInst ( operand ) ;
@ -901,8 +981,8 @@ std::any SysYIRGenerator::visitEqExp(SysYParser::EqExpContext *ctx) {
auto operand2 = constOperand - > isFloat ( ) ? constOperand - > getFloat ( )
: constOperand - > getInt ( ) ;
if ( opType = = SysYParser : : EQ ) result = ConstantValue : : get ( operand1 = = operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : NE ) result = ConstantValue : : get ( operand1 ! = operand2 ? 1 : 0 ) ;
if ( opType = = SysYParser : : EQ ) result = ConstantInteger : : get ( operand1 = = operand2 ? 1 : 0 ) ;
else if ( opType = = SysYParser : : NE ) result = ConstantInteger : : get ( operand1 ! = operand2 ? 1 : 0 ) ;
else assert ( false ) ;
} else {
@ -913,13 +993,13 @@ std::any SysYIRGenerator::visitEqExp(SysYParser::EqExpContext *ctx) {
if ( resultType = = floatType | | operandType = = floatType ) {
if ( resultType ! = floatType ) {
if ( constResult ! = nullptr )
result = ConstantValue : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
result = ConstantFloating : : get ( static_cast < float > ( constResult - > getInt ( ) ) ) ;
else
result = builder . createIToFInst ( result ) ;
}
if ( operandType ! = floatType ) {
if ( constOperand ! = nullptr )
operand = ConstantValue : : get ( static_cast < float > ( constOperand - > getInt ( ) ) ) ;
operand = ConstantFloating : : get ( static_cast < float > ( constOperand - > getInt ( ) ) ) ;
else
operand = builder . createIToFInst ( operand ) ;
}
@ -943,9 +1023,9 @@ std::any SysYIRGenerator::visitEqExp(SysYParser::EqExpContext *ctx) {
// 如果只有一个关系表达式, 则将结果转换为0或1
if ( constResult ! = nullptr ) {
if ( constResult - > isFloat ( ) )
result = ConstantValue : : get ( constResult - > getFloat ( ) ! = 0.0F ? 1 : 0 ) ;
result = ConstantInteger : : get ( constResult - > getFloat ( ) ! = 0.0F ? 1 : 0 ) ;
else
result = ConstantValue : : get ( constResult - > getInt ( ) ! = 0 ? 1 : 0 ) ;
result = ConstantInteger : : get ( constResult - > getInt ( ) ! = 0 ? 1 : 0 ) ;
}
}
@ -1013,6 +1093,7 @@ void Utils::tree2Array(Type *type, ArrayValueTree *root,
ValueCounter & result , IRBuilder * builder ) {
Value * value = root - > getValue ( ) ;
auto & children = root - > getChildren ( ) ;
// 类型转换
if ( value ! = nullptr ) {
if ( type = = value - > getType ( ) ) {
result . push_back ( value ) ;
@ -1020,14 +1101,14 @@ void Utils::tree2Array(Type *type, ArrayValueTree *root,
if ( type = = Type : : getFloatType ( ) ) {
ConstantValue * constValue = dynamic_cast < ConstantValue * > ( value ) ;
if ( constValue ! = nullptr )
result . push_back ( ConstantValue : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ) ;
result . push_back ( ConstantFloating : : get ( static_cast < float > ( constValue - > getInt ( ) ) ) ) ;
else
result . push_back ( builder - > createIToFInst ( value ) ) ;
} else {
ConstantValue * constValue = dynamic_cast < ConstantValue * > ( value ) ;
if ( constValue ! = nullptr )
result . push_back ( ConstantValue : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ) ;
result . push_back ( ConstantInteger : : get ( static_cast < int > ( constValue - > getFloat ( ) ) ) ) ;
else
result . push_back ( builder - > createFtoIInst ( value ) ) ;
@ -1061,9 +1142,9 @@ void Utils::tree2Array(Type *type, ArrayValueTree *root,
int num = blockSize - afterSize + beforeSize ;
if ( num > 0 ) {
if ( type = = Type : : getFloatType ( ) )
result . push_back ( ConstantValue : : get ( 0.0F ) , num ) ;
result . push_back ( ConstantFloating : : get ( 0.0F ) , num ) ;
else
result . push_back ( ConstantValue : : get ( 0 ) , num ) ;
result . push_back ( ConstantInteger : : get ( 0 ) , num ) ;
}
}
@ -1101,7 +1182,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) {
funcName , pModule , pBuilder ) ;
paramTypes . push_back ( Type : : getIntType ( ) ) ;
paramNames . emplace_back ( " x " ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantValue : : get ( - 1 ) } ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantInteger : : get ( - 1 ) } ) ;
funcName = " getarray " ;
Utils : : createExternalFunction ( paramTypes , paramNames , paramDims , returnType ,
funcName , pModule , pBuilder ) ;
@ -1117,7 +1198,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) {
returnType = Type : : getIntType ( ) ;
paramTypes . push_back ( Type : : getFloatType ( ) ) ;
paramNames . emplace_back ( " x " ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantValue : : get ( - 1 ) } ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantInteger : : get ( - 1 ) } ) ;
funcName = " getfarray " ;
Utils : : createExternalFunction ( paramTypes , paramNames , paramDims , returnType ,
funcName , pModule , pBuilder ) ;
@ -1141,7 +1222,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) {
paramTypes . push_back ( Type : : getIntType ( ) ) ;
paramDims . clear ( ) ;
paramDims . emplace_back ( ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantValue : : get ( - 1 ) } ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantInteger : : get ( - 1 ) } ) ;
paramNames . clear ( ) ;
paramNames . emplace_back ( " n " ) ;
paramNames . emplace_back ( " a " ) ;
@ -1164,7 +1245,7 @@ void Utils::initExternalFunction(Module *pModule, IRBuilder *pBuilder) {
paramTypes . push_back ( Type : : getFloatType ( ) ) ;
paramDims . clear ( ) ;
paramDims . emplace_back ( ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantValue : : get ( - 1 ) } ) ;
paramDims . push_back ( std : : vector < Value * > { ConstantInteger : : get ( - 1 ) } ) ;
paramNames . clear ( ) ;
paramNames . emplace_back ( " n " ) ;
paramNames . emplace_back ( " a " ) ;