4
4
5
5
VAST_RELAX_WARNINGS
6
6
#include < mlir/Analysis/DataLayoutAnalysis.h>
7
+ #include < mlir/Conversion/LLVMCommon/Pattern.h>
8
+ #include < mlir/Conversion/LLVMCommon/TypeConverter.h>
9
+ #include < mlir/Dialect/LLVMIR/LLVMDialect.h>
7
10
#include < mlir/IR/PatternMatch.h>
8
- #include < mlir/Transforms/GreedyPatternRewriteDriver.h>
9
11
#include < mlir/Transforms/DialectConversion.h>
10
- #include < mlir/Dialect/LLVMIR/LLVMDialect.h>
11
- #include < mlir/Conversion/LLVMCommon/TypeConverter.h>
12
- #include < mlir/Conversion/LLVMCommon/Pattern.h>
12
+ #include < mlir/Transforms/GreedyPatternRewriteDriver.h>
13
13
14
14
#include < llvm/ADT/APFloat.h>
15
15
VAST_UNRELAX_WARNINGS
16
16
17
17
#include " ../PassesDetails.hpp"
18
18
19
19
#include " vast/Dialect/HighLevel/HighLevelAttributes.hpp"
20
- #include " vast/Dialect/HighLevel/HighLevelTypes.hpp"
21
20
#include " vast/Dialect/HighLevel/HighLevelOps.hpp"
21
+ #include " vast/Dialect/HighLevel/HighLevelTypes.hpp"
22
22
23
23
#include " vast/Dialect/Core/CoreAttributes.hpp"
24
24
@@ -27,10 +27,10 @@ VAST_UNRELAX_WARNINGS
27
27
#include " vast/Dialect/Core/CoreOps.hpp"
28
28
#include " vast/Dialect/Core/TypeTraits.hpp"
29
29
30
+ #include " vast/Util/Common.hpp"
30
31
#include " vast/Util/Symbols.hpp"
31
32
#include " vast/Util/Terminator.hpp"
32
33
#include " vast/Util/TypeList.hpp"
33
- #include " vast/Util/Common.hpp"
34
34
35
35
#include " vast/Conversion/Common/Passes.hpp"
36
36
#include " vast/Conversion/TypeConverters/LLVMTypeConverter.hpp"
@@ -53,15 +53,12 @@ namespace vast::conv::irstollvm
53
53
using op_t = ll::StructGEPOp;
54
54
55
55
logical_result matchAndRewrite (
56
- op_t op, typename op_t ::Adaptor ops,
57
- conversion_rewriter &rewriter) const override
58
- {
59
- std::vector< mlir::LLVM::GEPArg > indices { 0ul , ops.getIdx () };
56
+ op_t op, typename op_t ::Adaptor ops, conversion_rewriter &rewriter
57
+ ) const override {
58
+ std::vector< mlir::LLVM::GEPArg > indices{ 0ul , ops.getIdx () };
60
59
auto gep = rewriter.create < mlir::LLVM::GEPOp >(
61
- op.getLoc (),
62
- convert (op.getType ()),
63
- ops.getRecord (),
64
- indices);
60
+ op.getLoc (), convert (op.getType ()), ops.getRecord (), indices
61
+ );
65
62
66
63
rewriter.replaceOp (op, gep);
67
64
return mlir::success ();
@@ -75,84 +72,65 @@ namespace vast::conv::irstollvm
75
72
76
73
using op_t = ll::Extract;
77
74
78
- std::size_t to_number (mlir::TypedAttr attr) const
79
- {
75
+ std::size_t to_number (mlir::TypedAttr attr) const {
80
76
auto int_attr = mlir::dyn_cast< mlir::IntegerAttr >(attr);
81
77
VAST_CHECK (int_attr, " Cannot convert {0} to `mlir::IntegerAttr`." , attr);
82
78
83
79
return int_attr.getUInt ();
84
80
}
85
81
86
- bool is_consistent (op_t op) const
87
- {
88
- auto size = to_number (op.getTo ()) - to_number (op.getFrom ()) + 1 ;
89
- const auto &dl = this ->type_converter ().getDataLayoutAnalysis ()
90
- ->getAtOrAbove (op);
82
+ bool is_consistent (op_t op) const {
83
+ auto size = to_number (op.getTo ()) - to_number (op.getFrom ()) + 1 ;
84
+ const auto &dl = this ->type_converter ().getDataLayoutAnalysis ()->getAtOrAbove (op);
91
85
auto target_bw = dl.getTypeSizeInBits (convert (op.getType ()));
92
86
93
87
return target_bw != size;
94
88
}
95
89
96
90
logical_result matchAndRewrite (
97
- op_t op, typename op_t ::Adaptor ops,
98
- conversion_rewriter &rewriter) const override
99
- {
91
+ op_t op, typename op_t ::Adaptor ops, conversion_rewriter &rewriter
92
+ ) const override {
100
93
auto loc = op.getLoc ();
101
94
102
- auto value = [&]() -> mlir::Value
103
- {
95
+ auto value = [&]() -> mlir::Value {
104
96
auto arg = ops.getArg ();
105
- if (auto ptr = mlir::dyn_cast< mlir::LLVM::LLVMPointerType >(arg.getType ()))
106
- {
97
+ if (auto ptr = mlir::dyn_cast< mlir::LLVM::LLVMPointerType >(arg.getType ())) {
107
98
return rewriter.create < mlir::LLVM::LoadOp >(
108
- op.getLoc (),
109
- ptr.getElementType (),
110
- arg);
99
+ op.getLoc (), ptr.getElementType (), arg
100
+ );
111
101
}
112
102
return arg;
113
103
}();
114
104
115
105
auto i8_type = mlir::IntegerType::get (getContext (), 8 );
116
106
117
- auto extract = [&](auto from, auto pos) -> mlir::Value
118
- {
107
+ auto extract = [&](auto from, auto pos) -> mlir::Value {
119
108
auto shift = rewriter.create < mlir::LLVM::LShrOp >(
120
- loc,
121
- value,
122
- iN (rewriter, loc, value.getType (), from));
123
- auto trunc = rewriter.create < mlir::LLVM::TruncOp >(
124
- loc,
125
- i8_type,
126
- shift);
127
- auto zext = rewriter.create < mlir::LLVM::ZExtOp >(
128
- loc,
129
- convert (op.getType ()),
130
- trunc);
131
-
132
- if (pos == 0 )
109
+ loc, value, iN (rewriter, loc, value.getType (), from)
110
+ );
111
+ auto trunc = rewriter.create < mlir::LLVM::TruncOp >(loc, i8_type, shift);
112
+ auto zext =
113
+ rewriter.create < mlir::LLVM::ZExtOp >(loc, convert (op.getType ()), trunc);
114
+
115
+ if (pos == 0 ) {
133
116
return zext;
117
+ }
134
118
135
119
return rewriter.create < mlir::LLVM::ShlOp >(
136
- loc,
137
- convert (op.getType ()),
138
- zext,
139
- iN (rewriter, loc, convert (op.getType ()), pos));
140
-
120
+ loc, convert (op.getType ()), zext,
121
+ iN (rewriter, loc, convert (op.getType ()), pos)
122
+ );
141
123
};
142
124
143
125
mlir::Value head = iN (rewriter, loc, convert (op.getType ()), 0 );
144
126
// TODO(conv:abi): It may be possible we don't need this in the end and plain
145
127
// `shift & trunc` will work. I am leaving it here for now as it
146
128
// seems to work.
147
- for (std::size_t i = 0 ; i < op.size () / 8 ; ++i)
148
- {
129
+ for (std::size_t i = 0 ; i < op.size () / 8 ; ++i) {
149
130
auto offset = op.from () + i * 8 ;
150
- auto byte = extract (offset, i * 8 );
151
- head = rewriter.create < mlir::LLVM::OrOp >(
152
- loc,
153
- convert (op.getType ()),
154
- byte,
155
- head);
131
+ auto byte = extract (offset, i * 8 );
132
+ head =
133
+ rewriter.create < mlir::LLVM::OrOp >(loc, convert (op.getType ()), byte, head);
156
134
}
157
135
rewriter.replaceOp (op, { head });
158
136
return mlir::success ();
@@ -166,44 +144,33 @@ namespace vast::conv::irstollvm
166
144
167
145
using op_t = ll::Concat;
168
146
169
- std::size_t bw (operation op) const
170
- {
147
+ std::size_t bw (operation op) const {
171
148
VAST_ASSERT (op->getNumResults () == 1 );
172
- const auto &dl = this ->type_converter ().getDataLayoutAnalysis ()
173
- ->getAtOrAbove (op);
149
+ const auto &dl = this ->type_converter ().getDataLayoutAnalysis ()->getAtOrAbove (op);
174
150
return dl.getTypeSizeInBits (convert (op->getResult (0 ).getType ()));
175
151
}
176
152
177
153
logical_result matchAndRewrite (
178
- op_t op, typename op_t ::Adaptor ops,
179
- conversion_rewriter &rewriter) const override
180
- {
154
+ op_t op, typename op_t ::Adaptor ops, conversion_rewriter &rewriter
155
+ ) const override {
181
156
auto loc = op.getLoc ();
182
157
183
- auto resize = [&](auto w) -> mlir::Value
184
- {
158
+ auto resize = [&](auto w) -> mlir::Value {
185
159
auto trg_type = convert (op.getType ());
186
- if (w.getType () == trg_type)
160
+ if (w.getType () == trg_type) {
187
161
return w;
188
- return rewriter.create < mlir::LLVM::ZExtOp >(
189
- loc,
190
- trg_type,
191
- w);
162
+ }
163
+ return rewriter.create < mlir::LLVM::ZExtOp >(loc, trg_type, w);
192
164
};
193
165
mlir::Value head = resize (ops.getOperands ()[0 ]);
194
166
195
167
std::size_t start = bw (ops.getOperands ()[0 ].getDefiningOp ());
196
- for (std::size_t i = 1 ; i < ops.getOperands ().size (); ++i)
197
- {
198
- auto full = resize (ops.getOperands ()[i]);
168
+ for (std::size_t i = 1 ; i < ops.getOperands ().size (); ++i) {
169
+ auto full = resize (ops.getOperands ()[i]);
199
170
auto shifted = rewriter.create < mlir::LLVM::ShlOp >(
200
- loc,
201
- full,
202
- mk_index (loc, start, rewriter));
203
- head = rewriter.create < mlir::LLVM::OrOp >(
204
- loc,
205
- head,
206
- shifted->getResult (0 ));
171
+ loc, full, mk_index (loc, start, rewriter)
172
+ );
173
+ head = rewriter.create < mlir::LLVM::OrOp >(loc, head, shifted->getResult (0 ));
207
174
208
175
start += bw (ops.getOperands ()[i].getDefiningOp ());
209
176
}
@@ -226,9 +193,8 @@ namespace vast::conv::irstollvm
226
193
using base::base;
227
194
228
195
logical_result matchAndRewrite (
229
- Op unit_op, typename Op::Adaptor ops,
230
- conversion_rewriter &rewriter) const override
231
- {
196
+ Op unit_op, typename Op::Adaptor ops, conversion_rewriter &rewriter
197
+ ) const override {
232
198
auto parent = unit_op.getBody ().getParentRegion ();
233
199
rewriter.inlineRegionBefore (unit_op.getBody (), *parent, parent->end ());
234
200
@@ -239,7 +205,6 @@ namespace vast::conv::irstollvm
239
205
rewriter.eraseOp (unit_op);
240
206
return logical_result::success ();
241
207
}
242
-
243
208
};
244
209
245
210
template < typename op_t >
@@ -250,37 +215,29 @@ namespace vast::conv::irstollvm
250
215
251
216
using Op = op_t ;
252
217
253
- mlir::Block *start_block (Op op) const override
254
- {
255
- return &*op.getBody ().begin ();
256
- }
218
+ mlir::Block *start_block (Op op) const override { return &*op.getBody ().begin (); }
257
219
258
- auto matchAndRewrite (Op op, typename Op::Adaptor ops,
259
- conversion_rewriter &rewriter) const
260
- -> logical_result override
261
- {
220
+ auto
221
+ matchAndRewrite (Op op, typename Op::Adaptor ops, conversion_rewriter &rewriter) const
222
+ -> logical_result override {
262
223
// If we do not have any branching inside, we can just "inline"
263
224
// the op.
264
- if (op.getBody ().hasOneBlock ())
225
+ if (op.getBody ().hasOneBlock ()) {
265
226
return base::handle_singleblock (op, ops, rewriter);
227
+ }
266
228
267
229
return base::handle_multiblock (op, ops, rewriter);
268
230
}
269
231
};
270
232
271
233
using label_stmt = hl_scopelike< hl::LabelStmt >;
272
- using scope_op = hl_scopelike< core::ScopeOp >;
234
+ using scope_op = hl_scopelike< core::ScopeOp >;
273
235
274
- using label_patterns = util::type_list<
275
- erase_pattern< hl::LabelDeclOp >,
276
- label_stmt
277
- >;
236
+ using label_patterns = util::type_list< erase_pattern< hl::LabelDeclOp >, label_stmt >;
278
237
279
238
// TODO(conv): Figure out if these can be somehow unified.
280
- using inline_region_from_op_conversions = util::type_list<
281
- inline_region_from_op< hl::TranslationUnitOp >,
282
- scope_op
283
- >;
239
+ using inline_region_from_op_conversions =
240
+ util::type_list< inline_region_from_op< hl::TranslationUnitOp >, scope_op >;
284
241
285
242
struct subscript : base_pattern< hl::SubscriptOp >
286
243
{
0 commit comments