Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,42 @@ if (DEFINED __RAPTOR_VERIFICARLOMCA_LIB_PATH)
target_compile_definitions(verificarlo_int INTERFACE __RAPTOR_VERIFICARLOMCA_INT_MODE)
endif()
endif()

if (DEFINED __RAPTOR_MCALITE_SOURCE_DIR)
if (NOT __RAPTOR_MCALITE_SOURCE_DIR MATCHES "MCAlite")
message(SEND_ERROR "__RAPTOR_MCALITE_SOURCE_DIR ${__RAPTOR_MCALITE_SOURCE_DIR} does not include the expected lib name")
elseif (NOT EXISTS "${__RAPTOR_MCALITE_SOURCE_DIR}")
message(SEND_ERROR "__RAPTOR_MCALITE_SOURCE_DIR ${__RAPTOR_MCALITE_SOURCE_DIR} does not exists")
elseif(NOT EXISTS "${__RAPTOR_MCALITE_SOURCE_DIR}/mca.h")
message(SEND_ERROR "MCAlite header file ${__RAPTOR_MCALITE_SOURCE_DIR}/mca.h does not exists")
elseif(NOT EXISTS "${__RAPTOR_MCALITE_SOURCE_DIR}/mca.c")
message(SEND_ERROR "MCAlite source file ${__RAPTOR_MCALITE_SOURCE_DIR}/mca.c does not exists")
else()
add_library(mcalite OBJECT "${__RAPTOR_MCALITE_SOURCE_DIR}/mca.h" "${__RAPTOR_MCALITE_SOURCE_DIR}/mca.c")
target_include_directories(mcalite PUBLIC ${__RAPTOR_MCALITE_SOURCE_DIR})
target_compile_definitions(mcalite PUBLIC __RAPTOR_MCALITE_MODE)
endif()
elseif (DEFINED __RAPTOR_MCALITE_HEADER_PATH)
if (NOT __RAPTOR_MCALITE_HEADER_PATH MATCHES "mca.h")
message(SEND_ERROR "__RAPTOR_MCALITE_HEADER_PATH ${__RAPTOR_MCALITE_HEADER_PATH} does not include the expected header name")
elseif (NOT EXISTS "${__RAPTOR_MCALITE_HEADER_PATH}")
message(SEND_ERROR "__RAPTOR_MCALITE_HEADER_PATH ${__RAPTOR_MCALITE_HEADER_PATH} does not exists")
elseif (NOT DEFINED __RAPTOR_MCALITE_LIB_PATH)
message(SEND_ERROR "__RAPTOR_MCALITE_LIB_PATH not defined, this is required for tests")
elseif (NOT __RAPTOR_MCALITE_LIB_PATH MATCHES "libmcalite.so")
message(SEND_ERROR "__RAPTOR_MCALITE_LIB_PATH ${__RAPTOR_MCALITE_LIB_PATH} does not include the expected library name")
elseif (NOT EXISTS "${__RAPTOR_MCALITE_LIB_PATH}")
message(SEND_ERROR "__RAPTOR_MCALITE_LIB_PATH ${__RAPTOR_MCALITE_LIB_PATH} does not exists")
else()
get_filename_component(__RAPTOR_MCALITE_SOURCE_DIR "${__RAPTOR_MCALITE_HEADER_PATH}" DIRECTORY)
add_library(mcalite INTERFACE "${__RAPTOR_MCALITE_HEADER_PATH}")
target_include_directories(mcalite INTERFACE ${__RAPTOR_MCALITE_SOURCE_DIR})
target_compile_definitions(mcalite INTERFACE __RAPTOR_MCALITE_MODE)
endif()
elseif (DEFINED __RAPTOR_MCALITE_LIB_PATH)
message(SEND_ERROR "__RAPTOR_MCALITE_LIB_PATH defined but __RAPTOR_MCALITE_HEADER_PATH not defined, the header is required to build the RAPTOR runtime")
endif()

add_subdirectory(runtime)
add_subdirectory(test)
add_subdirectory(wrappers)
3 changes: 3 additions & 0 deletions pass/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
if (DEFINED __RAPTOR_VERIFICARLOMCA_LIB_PATH)
add_compile_definitions(__RAPTOR_HAS_VERIFICARLOMCA)
endif()
if (DEFINED __RAPTOR_MCALITE_SOURCE_DIR)
add_compile_definitions(__RAPTOR_HAS_MCALITE)
endif()

# on windows `PLUGIN_TOOL` doesn't link against LLVM.dll
if ((WIN32 OR CYGWIN) AND LLVM_LINK_LLVM_DYLIB)
Expand Down
33 changes: 30 additions & 3 deletions pass/RaptorLogic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,8 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
}
};
if (TC.isToFPRT()) {
if (Mode == TruncOpMode || Mode == TruncOpMCAVerificarloMode) {
if (Mode == TruncOpMode || Mode == TruncOpMCAVerificarloMode ||
Mode == TruncOpMCAMCAliteMode) {
if (TC.NeedTruncChange || TC.NeedNewScratch)
AllocScratch();
if (!TC.NeedNewScratch) {
Expand Down Expand Up @@ -471,6 +472,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
EmitWarning(
"UnhandledTrunc", I,
"Operation not handled - it will be executed in the original way.",
Expand Down Expand Up @@ -502,6 +504,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
return floatValTruncate(B, v, TC);
}
llvm_unreachable("Unknown trunc mode");
Expand All @@ -514,6 +517,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
return floatValExpand(B, v, TC);
}
llvm_unreachable("Unknown trunc mode");
Expand Down Expand Up @@ -576,6 +580,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
return;
}
}
Expand Down Expand Up @@ -620,6 +625,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
return;
}
}
Expand All @@ -643,6 +649,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
return;
}
llvm_unreachable("");
Expand Down Expand Up @@ -680,6 +687,17 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
return;
}

if (Mode == TruncOpMCAMCAliteMode) {
// MCAlite only performs fadd, fsub, fmul and fdiv binary operations
switch (BO.getOpcode()) {
case BinaryOperator::FAdd:
case BinaryOperator::FSub:
case BinaryOperator::FMul:
case BinaryOperator::FDiv:
break;
default: return; break;
}
}
auto newI = getNewFromOriginal(&BO);
IRBuilder<> B(newI);
auto newLHS = truncate(B, getNewFromOriginal(oldLHS));
Expand Down Expand Up @@ -719,6 +737,9 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
bool handleIntrinsic(llvm::CallBase &CI, Intrinsic::ID ID) {
if (isDbgInfoIntrinsic(ID))
return true;

// MCAlite do not support intrinsics
if (Mode == TruncOpMCAMCAliteMode) { return true; }

auto newI = cast<llvm::CallBase>(getNewFromOriginal(&CI));
IRBuilder<> B(newI);
Expand Down Expand Up @@ -783,6 +804,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
break;
default:
llvm_unreachable("Unknown trunc mode");
Expand Down Expand Up @@ -816,6 +838,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
break;
default:
llvm_unreachable("Unknown trunc mode");
Expand Down Expand Up @@ -865,6 +888,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncMemMode:
case TruncOpMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
EmitWarning("FPNoFollow", CI,
"Will not follow FP through this indirect call.", CI);
break;
Expand All @@ -883,6 +907,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
break;
case TruncOpMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
EmitWarning("FPNoFollow", CI,
"Will not truncate flops in this function call as the "
"definition is not available.",
Expand Down Expand Up @@ -933,14 +958,15 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
IRBuilder<> BuilderZ(newCall);

if (Mode != TruncOpMode && Mode != TruncMemMode &&
Mode != TruncOpMCAVerificarloMode)
Mode != TruncOpMCAVerificarloMode && Mode != TruncOpMCAMCAliteMode)
return;

RequestContext ctx(&CI, &BuilderZ);
auto FTTs = getFunctionToTruncate(CI);
auto NeedDirectCall = [&](auto FTT) {
return scratch && (Mode == TruncOpMode ||
Mode == TruncOpMCAVerificarloMode) &&
Mode == TruncOpMCAVerificarloMode ||
Mode == TruncOpMCAMCAliteMode) &&
isa<CallInst>(&CI) &&
!FTT.isCallbackFunc();
};
Expand Down Expand Up @@ -1010,6 +1036,7 @@ class TruncateGenerator : public llvm::InstVisitor<TruncateGenerator>,
case TruncOpMode:
case TruncOpFullModuleMode:
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
break;
default:
llvm_unreachable("Unknown trunc mode");
Expand Down
11 changes: 11 additions & 0 deletions pass/RaptorLogic.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ namespace MCAType {
enum MCAType {
NoMCAType,
VerificarloMCA,
MCAlite,
NumMCAType
};
static constexpr int shift = 4;
Expand All @@ -98,6 +99,7 @@ enum TruncateMode {
TruncOpFullModuleMode = 0b0110,
TruncOpMCAVerificarloMode = TruncOpMode +
(MCAType::VerificarloMCA << MCAType::shift),
TruncOpMCAMCAliteMode = TruncOpMode + (MCAType::MCAlite << MCAType::shift),
};
[[maybe_unused]] static const char *truncateModeStr(TruncateMode mode) {
switch (mode) {
Expand All @@ -109,6 +111,8 @@ enum TruncateMode {
return "op_full_module";
case TruncOpMCAVerificarloMode:
return "op_mca_verificarlo";
case TruncOpMCAMCAliteMode:
return "op_mca_mcalite";
}
llvm_unreachable("Invalid truncation mode");
}
Expand All @@ -124,6 +128,8 @@ namespace MCAType {
switch (Mode) {
case TruncOpMCAVerificarloMode:
return {TruncOpMode, VerificarloMCA}; break;
case TruncOpMCAMCAliteMode:
return {TruncOpMode, MCAlite}; break;
default:
return {Mode, NoMCAType}; break;
}
Expand All @@ -133,6 +139,9 @@ namespace MCAType {
switch(mcaType) {
#ifdef __RAPTOR_HAS_VERIFICARLOMCA
case VerificarloMCA: return VerificarloMCA; break;
#endif
#ifdef __RAPTOR_HAS_MCALITE
case MCAlite: return MCAlite; break;
#endif
default: return NoMCAType; break;
}
Expand All @@ -142,6 +151,7 @@ namespace MCAType {
switch(mcaType) {
case NoMCAType: return ""; break;
case VerificarloMCA: return "verificarlo"; break;
case MCAlite: return "mcalite"; break;
default: return "invalid"; break;
}
}
Expand All @@ -156,6 +166,7 @@ namespace MCAType {
assert(!isMCA(Mode));
switch (Mode + (mcaType << shift)) {
case TruncOpMCAVerificarloMode:
case TruncOpMCAMCAliteMode:
return true; break;
default:
return false; break;
Expand Down
4 changes: 4 additions & 0 deletions runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ if (DEFINED __RAPTOR_VERIFICARLOMCA_INT_LIB_PATH)
target_link_libraries(Raptor-RT-${LLVM_VERSION_MAJOR} PRIVATE verificarlo_int)
endif()

if (DEFINED __RAPTOR_MCALITE_SOURCE_DIR)
target_link_libraries(Raptor-RT-${LLVM_VERSION_MAJOR} PRIVATE mcalite)
endif()

install(
DIRECTORY ${RAPTOR_PUBLIC_INCLUDE_DIR}
DESTINATION include
Expand Down
16 changes: 16 additions & 0 deletions runtime/include/private/raptor/Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@ typedef struct __raptor_fp {
// #endif
} __raptor_fp;

// Should match definition in pass/RaptorLogic.h
namespace MCAType {
enum MCAType {
NoMCAType,
VerificarloMCA,
MCAlite,
NumMCAType
};
static constexpr int shift = 4;
};

static inline bool __raptor_fprt_is_mem_mode(int64_t mode) {
return mode & 0b0001;
}
Expand All @@ -48,6 +59,11 @@ static inline bool __raptor_fprt_is_full_module_op_mode(int64_t mode) {
static inline bool __raptor_fprt_is_mca_mode(int64_t mode) {
return mode & 0b011110000;
}
static inline bool __raptor_fprt_mca_type_is(int64_t mode,
MCAType::MCAType mcaType)
{
return (mode & 0b011110000) == (mcaType << MCAType::shift);
}

__RAPTOR_MPFR_DECL_ATTRIBUTES
void raptor_fprt_gc_dump_status();
Expand Down
Loading
Loading