-
Notifications
You must be signed in to change notification settings - Fork 122
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
465d74a
commit 5441404
Showing
8 changed files
with
343 additions
and
110 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,110 +0,0 @@ | ||
cmake_minimum_required(VERSION 3.10) | ||
|
||
include(CheckCXXSourceCompiles) | ||
|
||
set(POLYGEIST_ENABLE_CUDA 0 CACHE BOOL "Enable CUDA compilation support") | ||
|
||
if(POLICY CMP0068) | ||
cmake_policy(SET CMP0068 NEW) | ||
set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) | ||
endif() | ||
|
||
if(POLICY CMP0075) | ||
cmake_policy(SET CMP0075 NEW) | ||
endif() | ||
|
||
if(POLICY CMP0077) | ||
cmake_policy(SET CMP0077 NEW) | ||
endif() | ||
|
||
option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON) | ||
option(LLVM_BUILD_TOOLS "Build the LLVM tools. If OFF, just generate build targets." ON) | ||
|
||
set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin) | ||
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib) | ||
|
||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) | ||
project(polygeist LANGUAGES CXX C) | ||
|
||
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to") | ||
|
||
message(STATUS "Searching for MLIRConfig.cmake in: ${MLIR_DIR}") | ||
find_package(MLIR REQUIRED CONFIG) | ||
|
||
set(Clang_DIR ${CLANG_DIR}) | ||
message(STATUS "Searching for ClangConfig.cmake in: ${Clang_DIR}") | ||
find_package(Clang REQUIRED CONFIG) | ||
|
||
# This is exported if we are building against a build area. If | ||
# building against an install area, then assume we're using the | ||
# submodule. | ||
if(NOT LLVM_BUILD_MAIN_SRC_DIR) | ||
set(LLVM_BUILD_MAIN_SRC_DIR ${CMAKE_SOURCE_DIR}/llvm-project/llvm) | ||
endif() | ||
set(LLVM_SOURCE_DIR ${LLVM_BUILD_MAIN_SRC_DIR} CACHE STRING "Location of LLVM source") | ||
|
||
message(STATUS "Using MLIRConfig.cmake in: ${MLIR_DIR}") | ||
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}") | ||
message(STATUS "Using ClangConfig.cmake in: ${CLANG_DIR}") | ||
else () | ||
set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR}) | ||
set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir) | ||
set(MLIR_INCLUDE_DIRS ${MLIR_MAIN_SRC_DIR}/include) | ||
set(MLIR_CMAKE_DIR ${MLIR_MAIN_SRC_DIR}/cmake/modules) | ||
set(MLIR_TABLEGEN_EXE $<TARGET_FILE:mlir-tblgen>) | ||
set(MLIR_TABLEGEN_OUTPUT_DIR ${LLVM_BINARY_DIR}/tools/mlir/include) | ||
set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) | ||
set(POLYGEIST_TABLEGEN_OUTPUT_DIR ${LLVM_BINARY_DIR}/tools/polygeist/include) | ||
include_directories(${MLIR_TABLEGEN_OUTPUT_DIR}) | ||
include_directories(${POLYGEIST_TABLEGEN_OUTPUT_DIR}) | ||
endif() | ||
|
||
function(append value) | ||
foreach(variable ${ARGN}) | ||
set(${variable} "${${variable}} ${value}" PARENT_SCOPE) | ||
endforeach(variable) | ||
endfunction() | ||
|
||
if( POLYGEIST_USE_LINKER ) | ||
append("-fuse-ld=${POLYGEIST_USE_LINKER}" | ||
CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS) | ||
check_cxx_source_compiles("int main() { return 0; }" CXX_SUPPORTS_CUSTOM_LINKER) | ||
if ( NOT CXX_SUPPORTS_CUSTOM_LINKER ) | ||
message(FATAL_ERROR "Host compiler does not support '-fuse-ld=${LLVM_USE_LINKER}'") | ||
endif() | ||
endif() | ||
|
||
list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}") | ||
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") | ||
list(APPEND CMAKE_MODULE_PATH "${CLANG_CMAKE_DIR}") | ||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}") | ||
include(TableGen) | ||
include(AddLLVM) | ||
include(AddMLIR) | ||
include(AddClang) | ||
include(HandleLLVMOptions) | ||
|
||
set(POLYGEIST_TOOLS_DIR ${CMAKE_BINARY_DIR}) | ||
|
||
include_directories(${LLVM_INCLUDE_DIRS}) | ||
include_directories(${CLANG_INCLUDE_DIRS}) | ||
include_directories(${MLIR_INCLUDE_DIRS}) | ||
include_directories(${PROJECT_SOURCE_DIR}/include) | ||
include_directories(${PROJECT_BINARY_DIR}/include) | ||
link_directories(${LLVM_BUILD_LIBRARY_DIR}) | ||
add_definitions(${LLVM_DEFINITIONS}) | ||
|
||
set(POLYGEIST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) | ||
set(POLYGEIST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) | ||
set(POLYGEIST_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include ) | ||
set(POLYGEIST_TOOLS_DIR ${CMAKE_BINARY_DIR}/bin) | ||
set(POLYGEIST_UTILS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/utils) | ||
|
||
set(LLVM_LIT_ARGS "-sv" CACHE STRING "lit default options") | ||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules") | ||
include(sanitizers) | ||
|
||
add_subdirectory(include) | ||
add_subdirectory(lib) | ||
add_subdirectory(tools) | ||
add_subdirectory(test) | ||
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
add_mlir_dialect(SQLOps sql) | ||
# add_mlir_doc(SQLDialect -gen-dialect-doc SQLDialect SQL/) | ||
# add_mlir_doc(SQLOps -gen-op-doc SQLOps SQL/) | ||
|
||
add_subdirectory(Passes) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
set(LLVM_TARGET_DEFINITIONS Passes.td) | ||
mlir_tablegen(Passes.h.inc -gen-pass-decls -name sql) | ||
add_public_tablegen_target(MLIRSQLPassIncGen) | ||
|
||
add_mlir_doc(Passes SQLPasses ./ -gen-pass-doc) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
#ifndef SQL_DIALECT_SQL_PASSES_H | ||
#define SQL_DIALECT_SQL_PASSES_H | ||
|
||
#include "mlir/Conversion/LLVMCommon/LoweringOptions.h" | ||
#include "mlir/Pass/Pass.h" | ||
#include <memory> | ||
namespace mlir { | ||
class PatternRewriter; | ||
class RewritePatternSet; | ||
class DominanceInfo; | ||
namespace sql { | ||
|
||
std::unique_ptr<Pass> createParallelLowerPass(); | ||
} // namespace sql | ||
} // namespace mlir | ||
|
||
namespace mlir { | ||
// Forward declaration from Dialect.h | ||
template <typename ConcreteDialect> | ||
void registerDialect(DialectRegistry ®istry); | ||
|
||
namespace arith { | ||
class ArithDialect; | ||
} // end namespace arith | ||
|
||
namespace scf { | ||
class SCFDialect; | ||
} // end namespace scf | ||
|
||
namespace memref { | ||
class MemRefDialect; | ||
} // end namespace memref | ||
|
||
namespace func { | ||
class FuncDialect; | ||
} | ||
|
||
class AffineDialect; | ||
namespace LLVM { | ||
class LLVMDialect; | ||
} | ||
|
||
#define GEN_PASS_REGISTRATION | ||
#include "sql/Passes/Passes.h.inc" | ||
|
||
} // end namespace mlir | ||
|
||
#endif // SQL_DIALECT_SQL_PASSES_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
#ifndef SQL_PASSES | ||
#define SQL_PASSES | ||
|
||
include "mlir/Pass/PassBase.td" | ||
|
||
|
||
def ParallelLower : Pass<"sql-lower", "mlir::ModuleOp"> { | ||
let summary = "Lower sql op to mlir"; | ||
let dependentDialects = | ||
["arith::AirthDialect", "func::FuncDialect", "LLVM::LLVMDialect"]; | ||
let constructor = "mlir::sql::createSQLLowerPass()"; | ||
} | ||
|
||
#endif // SQL_PASSES |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
#pragma once | ||
|
||
#include "mlir/Dialect/Affine/IR/AffineOps.h" | ||
#include "mlir/Dialect/SCF/IR/SCF.h" | ||
#include "mlir/IR/BlockAndValueMapping.h" | ||
#include "mlir/IR/IntegerSet.h" | ||
|
||
static inline mlir::scf::IfOp | ||
cloneWithResults(mlir::scf::IfOp op, mlir::OpBuilder &rewriter, | ||
mlir::BlockAndValueMapping mapping = {}) { | ||
using namespace mlir; | ||
return rewriter.create<scf::IfOp>(op.getLoc(), op.getResultTypes(), | ||
mapping.lookupOrDefault(op.getCondition()), | ||
true); | ||
} | ||
static inline mlir::AffineIfOp | ||
cloneWithResults(mlir::AffineIfOp op, mlir::OpBuilder &rewriter, | ||
mlir::BlockAndValueMapping mapping = {}) { | ||
using namespace mlir; | ||
SmallVector<mlir::Value> lower; | ||
for (auto o : op.getOperands()) | ||
lower.push_back(mapping.lookupOrDefault(o)); | ||
return rewriter.create<AffineIfOp>(op.getLoc(), op.getResultTypes(), | ||
op.getIntegerSet(), lower, true); | ||
} | ||
|
||
static inline mlir::scf::IfOp | ||
cloneWithoutResults(mlir::scf::IfOp op, mlir::OpBuilder &rewriter, | ||
mlir::BlockAndValueMapping mapping = {}, | ||
mlir::TypeRange types = {}) { | ||
using namespace mlir; | ||
return rewriter.create<scf::IfOp>( | ||
op.getLoc(), types, mapping.lookupOrDefault(op.getCondition()), true); | ||
} | ||
static inline mlir::AffineIfOp | ||
cloneWithoutResults(mlir::AffineIfOp op, mlir::OpBuilder &rewriter, | ||
mlir::BlockAndValueMapping mapping = {}, | ||
mlir::TypeRange types = {}) { | ||
using namespace mlir; | ||
SmallVector<mlir::Value> lower; | ||
for (auto o : op.getOperands()) | ||
lower.push_back(mapping.lookupOrDefault(o)); | ||
return rewriter.create<AffineIfOp>(op.getLoc(), types, op.getIntegerSet(), | ||
lower, true); | ||
} | ||
|
||
static inline mlir::scf::ForOp | ||
cloneWithoutResults(mlir::scf::ForOp op, mlir::PatternRewriter &rewriter, | ||
mlir::BlockAndValueMapping mapping = {}) { | ||
using namespace mlir; | ||
return rewriter.create<scf::ForOp>( | ||
op.getLoc(), mapping.lookupOrDefault(op.getLowerBound()), | ||
mapping.lookupOrDefault(op.getUpperBound()), | ||
mapping.lookupOrDefault(op.getStep())); | ||
} | ||
static inline mlir::AffineForOp | ||
cloneWithoutResults(mlir::AffineForOp op, mlir::PatternRewriter &rewriter, | ||
mlir::BlockAndValueMapping mapping = {}) { | ||
using namespace mlir; | ||
SmallVector<Value> lower; | ||
for (auto o : op.getLowerBoundOperands()) | ||
lower.push_back(mapping.lookupOrDefault(o)); | ||
SmallVector<Value> upper; | ||
for (auto o : op.getUpperBoundOperands()) | ||
upper.push_back(mapping.lookupOrDefault(o)); | ||
return rewriter.create<AffineForOp>(op.getLoc(), lower, op.getLowerBoundMap(), | ||
upper, op.getUpperBoundMap(), | ||
op.getStep()); | ||
} | ||
|
||
static inline void clearBlock(mlir::Block *block, | ||
mlir::PatternRewriter &rewriter) { | ||
for (auto &op : llvm::make_early_inc_range(llvm::reverse(*block))) { | ||
assert(op.use_empty() && "expected 'op' to have no uses"); | ||
rewriter.eraseOp(&op); | ||
} | ||
} | ||
|
||
static inline mlir::Block *getThenBlock(mlir::scf::IfOp op) { | ||
return op.thenBlock(); | ||
} | ||
static inline mlir::Block *getThenBlock(mlir::AffineIfOp op) { | ||
return op.getThenBlock(); | ||
} | ||
static inline mlir::Block *getElseBlock(mlir::scf::IfOp op) { | ||
return op.elseBlock(); | ||
} | ||
static inline mlir::Block *getElseBlock(mlir::AffineIfOp op) { | ||
if (op.hasElse()) | ||
return op.getElseBlock(); | ||
else | ||
return nullptr; | ||
} | ||
|
||
static inline mlir::Region &getThenRegion(mlir::scf::IfOp op) { | ||
return op.getThenRegion(); | ||
} | ||
static inline mlir::Region &getThenRegion(mlir::AffineIfOp op) { | ||
return op.getThenRegion(); | ||
} | ||
static inline mlir::Region &getElseRegion(mlir::scf::IfOp op) { | ||
return op.getElseRegion(); | ||
} | ||
static inline mlir::Region &getElseRegion(mlir::AffineIfOp op) { | ||
return op.getElseRegion(); | ||
} | ||
|
||
static inline mlir::scf::YieldOp getThenYield(mlir::scf::IfOp op) { | ||
return op.thenYield(); | ||
} | ||
static inline mlir::AffineYieldOp getThenYield(mlir::AffineIfOp op) { | ||
return llvm::cast<mlir::AffineYieldOp>(op.getThenBlock()->getTerminator()); | ||
} | ||
static inline mlir::scf::YieldOp getElseYield(mlir::scf::IfOp op) { | ||
return op.elseYield(); | ||
} | ||
static inline mlir::AffineYieldOp getElseYield(mlir::AffineIfOp op) { | ||
return llvm::cast<mlir::AffineYieldOp>(op.getElseBlock()->getTerminator()); | ||
} | ||
|
||
static inline bool inBound(mlir::scf::IfOp op, mlir::Value v) { | ||
return op.getCondition() == v; | ||
} | ||
static inline bool inBound(mlir::AffineIfOp op, mlir::Value v) { | ||
return llvm::any_of(op.getOperands(), [&](mlir::Value e) { return e == v; }); | ||
} | ||
static inline bool inBound(mlir::scf::ForOp op, mlir::Value v) { | ||
return op.getUpperBound() == v; | ||
} | ||
static inline bool inBound(mlir::AffineForOp op, mlir::Value v) { | ||
return llvm::any_of(op.getUpperBoundOperands(), | ||
[&](mlir::Value e) { return e == v; }); | ||
} | ||
static inline bool hasElse(mlir::scf::IfOp op) { | ||
return op.getElseRegion().getBlocks().size() > 0; | ||
} | ||
static inline bool hasElse(mlir::AffineIfOp op) { | ||
return op.getElseRegion().getBlocks().size() > 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
add_mlir_dialect_library(MLIRSQLTransforms | ||
SQLLower.cpp | ||
|
||
DEPENDS | ||
MLIRPolygeistOpsIncGen | ||
MLIRPolygeistPassIncGen | ||
|
||
LINK_LIBS PUBLIC | ||
MLIRArithDialect | ||
MLIRFuncDialect | ||
MLIRFuncTransforms | ||
MLIRIR | ||
MLIRLLVMDialect | ||
MLIRMathDialect | ||
MLIRMemRefDialect | ||
MLIRPass | ||
) |
Oops, something went wrong.