Skip to content

Commit 5441404

Browse files
committed
SQLLower
1 parent 465d74a commit 5441404

File tree

8 files changed

+343
-110
lines changed

8 files changed

+343
-110
lines changed

CMakeLists.txt

-110
Original file line numberDiff line numberDiff line change
@@ -1,110 +0,0 @@
1-
cmake_minimum_required(VERSION 3.10)
2-
3-
include(CheckCXXSourceCompiles)
4-
5-
set(POLYGEIST_ENABLE_CUDA 0 CACHE BOOL "Enable CUDA compilation support")
6-
7-
if(POLICY CMP0068)
8-
cmake_policy(SET CMP0068 NEW)
9-
set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
10-
endif()
11-
12-
if(POLICY CMP0075)
13-
cmake_policy(SET CMP0075 NEW)
14-
endif()
15-
16-
if(POLICY CMP0077)
17-
cmake_policy(SET CMP0077 NEW)
18-
endif()
19-
20-
option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
21-
option(LLVM_BUILD_TOOLS "Build the LLVM tools. If OFF, just generate build targets." ON)
22-
23-
set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/bin)
24-
set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/lib)
25-
26-
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
27-
project(polygeist LANGUAGES CXX C)
28-
29-
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
30-
31-
message(STATUS "Searching for MLIRConfig.cmake in: ${MLIR_DIR}")
32-
find_package(MLIR REQUIRED CONFIG)
33-
34-
set(Clang_DIR ${CLANG_DIR})
35-
message(STATUS "Searching for ClangConfig.cmake in: ${Clang_DIR}")
36-
find_package(Clang REQUIRED CONFIG)
37-
38-
# This is exported if we are building against a build area. If
39-
# building against an install area, then assume we're using the
40-
# submodule.
41-
if(NOT LLVM_BUILD_MAIN_SRC_DIR)
42-
set(LLVM_BUILD_MAIN_SRC_DIR ${CMAKE_SOURCE_DIR}/llvm-project/llvm)
43-
endif()
44-
set(LLVM_SOURCE_DIR ${LLVM_BUILD_MAIN_SRC_DIR} CACHE STRING "Location of LLVM source")
45-
46-
message(STATUS "Using MLIRConfig.cmake in: ${MLIR_DIR}")
47-
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
48-
message(STATUS "Using ClangConfig.cmake in: ${CLANG_DIR}")
49-
else ()
50-
set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR})
51-
set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir)
52-
set(MLIR_INCLUDE_DIRS ${MLIR_MAIN_SRC_DIR}/include)
53-
set(MLIR_CMAKE_DIR ${MLIR_MAIN_SRC_DIR}/cmake/modules)
54-
set(MLIR_TABLEGEN_EXE $<TARGET_FILE:mlir-tblgen>)
55-
set(MLIR_TABLEGEN_OUTPUT_DIR ${LLVM_BINARY_DIR}/tools/mlir/include)
56-
set(PROJECT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
57-
set(POLYGEIST_TABLEGEN_OUTPUT_DIR ${LLVM_BINARY_DIR}/tools/polygeist/include)
58-
include_directories(${MLIR_TABLEGEN_OUTPUT_DIR})
59-
include_directories(${POLYGEIST_TABLEGEN_OUTPUT_DIR})
60-
endif()
61-
62-
function(append value)
63-
foreach(variable ${ARGN})
64-
set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
65-
endforeach(variable)
66-
endfunction()
67-
68-
if( POLYGEIST_USE_LINKER )
69-
append("-fuse-ld=${POLYGEIST_USE_LINKER}"
70-
CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS)
71-
check_cxx_source_compiles("int main() { return 0; }" CXX_SUPPORTS_CUSTOM_LINKER)
72-
if ( NOT CXX_SUPPORTS_CUSTOM_LINKER )
73-
message(FATAL_ERROR "Host compiler does not support '-fuse-ld=${LLVM_USE_LINKER}'")
74-
endif()
75-
endif()
76-
77-
list(APPEND CMAKE_MODULE_PATH "${MLIR_CMAKE_DIR}")
78-
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
79-
list(APPEND CMAKE_MODULE_PATH "${CLANG_CMAKE_DIR}")
80-
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
81-
include(TableGen)
82-
include(AddLLVM)
83-
include(AddMLIR)
84-
include(AddClang)
85-
include(HandleLLVMOptions)
86-
87-
set(POLYGEIST_TOOLS_DIR ${CMAKE_BINARY_DIR})
88-
89-
include_directories(${LLVM_INCLUDE_DIRS})
90-
include_directories(${CLANG_INCLUDE_DIRS})
91-
include_directories(${MLIR_INCLUDE_DIRS})
92-
include_directories(${PROJECT_SOURCE_DIR}/include)
93-
include_directories(${PROJECT_BINARY_DIR}/include)
94-
link_directories(${LLVM_BUILD_LIBRARY_DIR})
95-
add_definitions(${LLVM_DEFINITIONS})
96-
97-
set(POLYGEIST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
98-
set(POLYGEIST_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
99-
set(POLYGEIST_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include )
100-
set(POLYGEIST_TOOLS_DIR ${CMAKE_BINARY_DIR}/bin)
101-
set(POLYGEIST_UTILS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/utils)
102-
103-
set(LLVM_LIT_ARGS "-sv" CACHE STRING "lit default options")
104-
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules")
105-
include(sanitizers)
106-
107-
add_subdirectory(include)
108-
add_subdirectory(lib)
109-
add_subdirectory(tools)
110-
add_subdirectory(test)

include/sql/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
add_mlir_dialect(SQLOps sql)
22
# add_mlir_doc(SQLDialect -gen-dialect-doc SQLDialect SQL/)
33
# add_mlir_doc(SQLOps -gen-op-doc SQLOps SQL/)
4+
5+
add_subdirectory(Passes)

include/sql/Passes/CMakeLists.txt

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
set(LLVM_TARGET_DEFINITIONS Passes.td)
2+
mlir_tablegen(Passes.h.inc -gen-pass-decls -name sql)
3+
add_public_tablegen_target(MLIRSQLPassIncGen)
4+
5+
add_mlir_doc(Passes SQLPasses ./ -gen-pass-doc)

include/sql/Passes/Passes.h

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#ifndef SQL_DIALECT_SQL_PASSES_H
2+
#define SQL_DIALECT_SQL_PASSES_H
3+
4+
#include "mlir/Conversion/LLVMCommon/LoweringOptions.h"
5+
#include "mlir/Pass/Pass.h"
6+
#include <memory>
7+
namespace mlir {
8+
class PatternRewriter;
9+
class RewritePatternSet;
10+
class DominanceInfo;
11+
namespace sql {
12+
13+
std::unique_ptr<Pass> createParallelLowerPass();
14+
} // namespace sql
15+
} // namespace mlir
16+
17+
namespace mlir {
18+
// Forward declaration from Dialect.h
19+
template <typename ConcreteDialect>
20+
void registerDialect(DialectRegistry &registry);
21+
22+
namespace arith {
23+
class ArithDialect;
24+
} // end namespace arith
25+
26+
namespace scf {
27+
class SCFDialect;
28+
} // end namespace scf
29+
30+
namespace memref {
31+
class MemRefDialect;
32+
} // end namespace memref
33+
34+
namespace func {
35+
class FuncDialect;
36+
}
37+
38+
class AffineDialect;
39+
namespace LLVM {
40+
class LLVMDialect;
41+
}
42+
43+
#define GEN_PASS_REGISTRATION
44+
#include "sql/Passes/Passes.h.inc"
45+
46+
} // end namespace mlir
47+
48+
#endif // SQL_DIALECT_SQL_PASSES_H

include/sql/Passes/Passes.td

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef SQL_PASSES
2+
#define SQL_PASSES
3+
4+
include "mlir/Pass/PassBase.td"
5+
6+
7+
def ParallelLower : Pass<"sql-lower", "mlir::ModuleOp"> {
8+
let summary = "Lower sql op to mlir";
9+
let dependentDialects =
10+
["arith::AirthDialect", "func::FuncDialect", "LLVM::LLVMDialect"];
11+
let constructor = "mlir::sql::createSQLLowerPass()";
12+
}
13+
14+
#endif // SQL_PASSES

include/sql/Passes/Utils.h

+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
#pragma once
2+
3+
#include "mlir/Dialect/Affine/IR/AffineOps.h"
4+
#include "mlir/Dialect/SCF/IR/SCF.h"
5+
#include "mlir/IR/BlockAndValueMapping.h"
6+
#include "mlir/IR/IntegerSet.h"
7+
8+
static inline mlir::scf::IfOp
9+
cloneWithResults(mlir::scf::IfOp op, mlir::OpBuilder &rewriter,
10+
mlir::BlockAndValueMapping mapping = {}) {
11+
using namespace mlir;
12+
return rewriter.create<scf::IfOp>(op.getLoc(), op.getResultTypes(),
13+
mapping.lookupOrDefault(op.getCondition()),
14+
true);
15+
}
16+
static inline mlir::AffineIfOp
17+
cloneWithResults(mlir::AffineIfOp op, mlir::OpBuilder &rewriter,
18+
mlir::BlockAndValueMapping mapping = {}) {
19+
using namespace mlir;
20+
SmallVector<mlir::Value> lower;
21+
for (auto o : op.getOperands())
22+
lower.push_back(mapping.lookupOrDefault(o));
23+
return rewriter.create<AffineIfOp>(op.getLoc(), op.getResultTypes(),
24+
op.getIntegerSet(), lower, true);
25+
}
26+
27+
static inline mlir::scf::IfOp
28+
cloneWithoutResults(mlir::scf::IfOp op, mlir::OpBuilder &rewriter,
29+
mlir::BlockAndValueMapping mapping = {},
30+
mlir::TypeRange types = {}) {
31+
using namespace mlir;
32+
return rewriter.create<scf::IfOp>(
33+
op.getLoc(), types, mapping.lookupOrDefault(op.getCondition()), true);
34+
}
35+
static inline mlir::AffineIfOp
36+
cloneWithoutResults(mlir::AffineIfOp op, mlir::OpBuilder &rewriter,
37+
mlir::BlockAndValueMapping mapping = {},
38+
mlir::TypeRange types = {}) {
39+
using namespace mlir;
40+
SmallVector<mlir::Value> lower;
41+
for (auto o : op.getOperands())
42+
lower.push_back(mapping.lookupOrDefault(o));
43+
return rewriter.create<AffineIfOp>(op.getLoc(), types, op.getIntegerSet(),
44+
lower, true);
45+
}
46+
47+
static inline mlir::scf::ForOp
48+
cloneWithoutResults(mlir::scf::ForOp op, mlir::PatternRewriter &rewriter,
49+
mlir::BlockAndValueMapping mapping = {}) {
50+
using namespace mlir;
51+
return rewriter.create<scf::ForOp>(
52+
op.getLoc(), mapping.lookupOrDefault(op.getLowerBound()),
53+
mapping.lookupOrDefault(op.getUpperBound()),
54+
mapping.lookupOrDefault(op.getStep()));
55+
}
56+
static inline mlir::AffineForOp
57+
cloneWithoutResults(mlir::AffineForOp op, mlir::PatternRewriter &rewriter,
58+
mlir::BlockAndValueMapping mapping = {}) {
59+
using namespace mlir;
60+
SmallVector<Value> lower;
61+
for (auto o : op.getLowerBoundOperands())
62+
lower.push_back(mapping.lookupOrDefault(o));
63+
SmallVector<Value> upper;
64+
for (auto o : op.getUpperBoundOperands())
65+
upper.push_back(mapping.lookupOrDefault(o));
66+
return rewriter.create<AffineForOp>(op.getLoc(), lower, op.getLowerBoundMap(),
67+
upper, op.getUpperBoundMap(),
68+
op.getStep());
69+
}
70+
71+
static inline void clearBlock(mlir::Block *block,
72+
mlir::PatternRewriter &rewriter) {
73+
for (auto &op : llvm::make_early_inc_range(llvm::reverse(*block))) {
74+
assert(op.use_empty() && "expected 'op' to have no uses");
75+
rewriter.eraseOp(&op);
76+
}
77+
}
78+
79+
static inline mlir::Block *getThenBlock(mlir::scf::IfOp op) {
80+
return op.thenBlock();
81+
}
82+
static inline mlir::Block *getThenBlock(mlir::AffineIfOp op) {
83+
return op.getThenBlock();
84+
}
85+
static inline mlir::Block *getElseBlock(mlir::scf::IfOp op) {
86+
return op.elseBlock();
87+
}
88+
static inline mlir::Block *getElseBlock(mlir::AffineIfOp op) {
89+
if (op.hasElse())
90+
return op.getElseBlock();
91+
else
92+
return nullptr;
93+
}
94+
95+
static inline mlir::Region &getThenRegion(mlir::scf::IfOp op) {
96+
return op.getThenRegion();
97+
}
98+
static inline mlir::Region &getThenRegion(mlir::AffineIfOp op) {
99+
return op.getThenRegion();
100+
}
101+
static inline mlir::Region &getElseRegion(mlir::scf::IfOp op) {
102+
return op.getElseRegion();
103+
}
104+
static inline mlir::Region &getElseRegion(mlir::AffineIfOp op) {
105+
return op.getElseRegion();
106+
}
107+
108+
static inline mlir::scf::YieldOp getThenYield(mlir::scf::IfOp op) {
109+
return op.thenYield();
110+
}
111+
static inline mlir::AffineYieldOp getThenYield(mlir::AffineIfOp op) {
112+
return llvm::cast<mlir::AffineYieldOp>(op.getThenBlock()->getTerminator());
113+
}
114+
static inline mlir::scf::YieldOp getElseYield(mlir::scf::IfOp op) {
115+
return op.elseYield();
116+
}
117+
static inline mlir::AffineYieldOp getElseYield(mlir::AffineIfOp op) {
118+
return llvm::cast<mlir::AffineYieldOp>(op.getElseBlock()->getTerminator());
119+
}
120+
121+
static inline bool inBound(mlir::scf::IfOp op, mlir::Value v) {
122+
return op.getCondition() == v;
123+
}
124+
static inline bool inBound(mlir::AffineIfOp op, mlir::Value v) {
125+
return llvm::any_of(op.getOperands(), [&](mlir::Value e) { return e == v; });
126+
}
127+
static inline bool inBound(mlir::scf::ForOp op, mlir::Value v) {
128+
return op.getUpperBound() == v;
129+
}
130+
static inline bool inBound(mlir::AffineForOp op, mlir::Value v) {
131+
return llvm::any_of(op.getUpperBoundOperands(),
132+
[&](mlir::Value e) { return e == v; });
133+
}
134+
static inline bool hasElse(mlir::scf::IfOp op) {
135+
return op.getElseRegion().getBlocks().size() > 0;
136+
}
137+
static inline bool hasElse(mlir::AffineIfOp op) {
138+
return op.getElseRegion().getBlocks().size() > 0;
139+
}

lib/sql/Passes/CMakeLists.txt

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
add_mlir_dialect_library(MLIRSQLTransforms
2+
SQLLower.cpp
3+
4+
DEPENDS
5+
MLIRPolygeistOpsIncGen
6+
MLIRPolygeistPassIncGen
7+
8+
LINK_LIBS PUBLIC
9+
MLIRArithDialect
10+
MLIRFuncDialect
11+
MLIRFuncTransforms
12+
MLIRIR
13+
MLIRLLVMDialect
14+
MLIRMathDialect
15+
MLIRMemRefDialect
16+
MLIRPass
17+
)

0 commit comments

Comments
 (0)