Skip to content

Commit 1aaa903

Browse files
committed
[mlir][evm] Lower the remaining builtins
This includes: extcodecopy extcodehash balance selfbalance chainid basefee blobbasefee origin gasprice blockhash blobhash coinbase timestamp number prevrandao gaslimit callcode
1 parent 0648815 commit 1aaa903

37 files changed

+1395
-52
lines changed

libsolidity/codegen/mlir/Target/EVM/YulToStandard.cpp

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,32 @@ struct AddressOpLowering : public OpRewritePattern<yul::AddressOp> {
174174
}
175175
};
176176

177+
struct BalanceOpLowering : public OpRewritePattern<yul::BalanceOp> {
178+
using OpRewritePattern<yul::BalanceOp>::OpRewritePattern;
179+
180+
LogicalResult matchAndRewrite(yul::BalanceOp op,
181+
PatternRewriter &r) const override {
182+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_balance,
183+
/*resTy=*/r.getIntegerType(256),
184+
/*ins=*/ValueRange{op.getAddr()},
185+
"evm.balance");
186+
return success();
187+
}
188+
};
189+
190+
struct SelfBalanceOpLowering : public OpRewritePattern<yul::SelfBalanceOp> {
191+
using OpRewritePattern<yul::SelfBalanceOp>::OpRewritePattern;
192+
193+
LogicalResult matchAndRewrite(yul::SelfBalanceOp op,
194+
PatternRewriter &r) const override {
195+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_selfbalance,
196+
/*resTy=*/r.getIntegerType(256),
197+
/*ins=*/ValueRange{},
198+
"evm.selfbalance");
199+
return success();
200+
}
201+
};
202+
177203
struct CallerOpLowering : public OpRewritePattern<yul::CallerOp> {
178204
using OpRewritePattern<yul::CallerOp>::OpRewritePattern;
179205

@@ -199,6 +225,159 @@ struct GasOpLowering : public OpRewritePattern<yul::GasOp> {
199225
}
200226
};
201227

228+
struct ChainIdOpLowering : public OpRewritePattern<yul::ChainIdOp> {
229+
using OpRewritePattern<yul::ChainIdOp>::OpRewritePattern;
230+
231+
LogicalResult matchAndRewrite(yul::ChainIdOp op,
232+
PatternRewriter &r) const override {
233+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_chainid,
234+
/*resTy=*/r.getIntegerType(256),
235+
/*ins=*/ValueRange{}, "evm.chainid");
236+
return success();
237+
}
238+
};
239+
240+
struct BaseFeeOpLowering : public OpRewritePattern<yul::BaseFeeOp> {
241+
using OpRewritePattern<yul::BaseFeeOp>::OpRewritePattern;
242+
243+
LogicalResult matchAndRewrite(yul::BaseFeeOp op,
244+
PatternRewriter &r) const override {
245+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_basefee,
246+
/*resTy=*/r.getIntegerType(256),
247+
/*ins=*/ValueRange{}, "evm.basefee");
248+
return success();
249+
}
250+
};
251+
252+
struct BlobBaseFeeOpLowering : public OpRewritePattern<yul::BlobBaseFeeOp> {
253+
using OpRewritePattern<yul::BlobBaseFeeOp>::OpRewritePattern;
254+
255+
LogicalResult matchAndRewrite(yul::BlobBaseFeeOp op,
256+
PatternRewriter &r) const override {
257+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_blobbasefee,
258+
/*resTy=*/r.getIntegerType(256),
259+
/*ins=*/ValueRange{},
260+
"evm.blobbasefee");
261+
return success();
262+
}
263+
};
264+
265+
struct OriginOpLowering : public OpRewritePattern<yul::OriginOp> {
266+
using OpRewritePattern<yul::OriginOp>::OpRewritePattern;
267+
268+
LogicalResult matchAndRewrite(yul::OriginOp op,
269+
PatternRewriter &r) const override {
270+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_origin,
271+
/*resTy=*/r.getIntegerType(256),
272+
/*ins=*/ValueRange{}, "evm.origin");
273+
return success();
274+
}
275+
};
276+
277+
struct GasPriceOpLowering : public OpRewritePattern<yul::GasPriceOp> {
278+
using OpRewritePattern<yul::GasPriceOp>::OpRewritePattern;
279+
280+
LogicalResult matchAndRewrite(yul::GasPriceOp op,
281+
PatternRewriter &r) const override {
282+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_gasprice,
283+
/*resTy=*/r.getIntegerType(256),
284+
/*ins=*/ValueRange{},
285+
"evm.gasprice");
286+
return success();
287+
}
288+
};
289+
290+
struct BlockHashOpLowering : public OpRewritePattern<yul::BlockHashOp> {
291+
using OpRewritePattern<yul::BlockHashOp>::OpRewritePattern;
292+
293+
LogicalResult matchAndRewrite(yul::BlockHashOp op,
294+
PatternRewriter &r) const override {
295+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_blockhash,
296+
/*resTy=*/r.getIntegerType(256),
297+
/*ins=*/ValueRange{op.getBlock()},
298+
"evm.blockhash");
299+
return success();
300+
}
301+
};
302+
303+
struct BlobHashOpLowering : public OpRewritePattern<yul::BlobHashOp> {
304+
using OpRewritePattern<yul::BlobHashOp>::OpRewritePattern;
305+
306+
LogicalResult matchAndRewrite(yul::BlobHashOp op,
307+
PatternRewriter &r) const override {
308+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_blobhash,
309+
/*resTy=*/r.getIntegerType(256),
310+
/*ins=*/ValueRange{op.getIdx()},
311+
"evm.blobhash");
312+
return success();
313+
}
314+
};
315+
316+
struct CoinBaseOpLowering : public OpRewritePattern<yul::CoinBaseOp> {
317+
using OpRewritePattern<yul::CoinBaseOp>::OpRewritePattern;
318+
319+
LogicalResult matchAndRewrite(yul::CoinBaseOp op,
320+
PatternRewriter &r) const override {
321+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_coinbase,
322+
/*resTy=*/r.getIntegerType(256),
323+
/*ins=*/ValueRange{},
324+
"evm.coinbase");
325+
return success();
326+
}
327+
};
328+
329+
struct TimeStampOpLowering : public OpRewritePattern<yul::TimeStampOp> {
330+
using OpRewritePattern<yul::TimeStampOp>::OpRewritePattern;
331+
332+
LogicalResult matchAndRewrite(yul::TimeStampOp op,
333+
PatternRewriter &r) const override {
334+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_timestamp,
335+
/*resTy=*/r.getIntegerType(256),
336+
/*ins=*/ValueRange{},
337+
"evm.timestamp");
338+
return success();
339+
}
340+
};
341+
342+
struct NumberOpLowering : public OpRewritePattern<yul::NumberOp> {
343+
using OpRewritePattern<yul::NumberOp>::OpRewritePattern;
344+
345+
LogicalResult matchAndRewrite(yul::NumberOp op,
346+
PatternRewriter &r) const override {
347+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_number,
348+
/*resTy=*/r.getIntegerType(256),
349+
/*ins=*/ValueRange{}, "evm.number");
350+
return success();
351+
}
352+
};
353+
354+
struct PrevrandaoOpLowering : public OpRewritePattern<yul::PrevrandaoOp> {
355+
using OpRewritePattern<yul::PrevrandaoOp>::OpRewritePattern;
356+
357+
LogicalResult matchAndRewrite(yul::PrevrandaoOp op,
358+
PatternRewriter &r) const override {
359+
// TODO: fix the intrinsic name in LLVM.
360+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_difficulty,
361+
/*resTy=*/r.getIntegerType(256),
362+
/*ins=*/ValueRange{},
363+
"evm.difficulty");
364+
return success();
365+
}
366+
};
367+
368+
struct GasLimitOpLowering : public OpRewritePattern<yul::GasLimitOp> {
369+
using OpRewritePattern<yul::GasLimitOp>::OpRewritePattern;
370+
371+
LogicalResult matchAndRewrite(yul::GasLimitOp op,
372+
PatternRewriter &r) const override {
373+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_gaslimit,
374+
/*resTy=*/r.getIntegerType(256),
375+
/*ins=*/ValueRange{},
376+
"evm.gaslimit");
377+
return success();
378+
}
379+
};
380+
202381
struct CallValOpLowering : public OpRewritePattern<yul::CallValOp> {
203382
using OpRewritePattern<yul::CallValOp>::OpRewritePattern;
204383

@@ -424,6 +603,19 @@ struct ExtCodeCopyOpLowering : public OpRewritePattern<yul::ExtCodeCopyOp> {
424603
}
425604
};
426605

606+
struct ExtCodeHashOpLowering : public OpRewritePattern<yul::ExtCodeHashOp> {
607+
using OpRewritePattern<yul::ExtCodeHashOp>::OpRewritePattern;
608+
609+
LogicalResult matchAndRewrite(yul::ExtCodeHashOp op,
610+
PatternRewriter &r) const override {
611+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(op, llvm::Intrinsic::evm_extcodehash,
612+
/*resTy=*/r.getIntegerType(256),
613+
/*ins=*/op.getAddr(),
614+
"evm.extcodehash");
615+
return success();
616+
}
617+
};
618+
427619
struct CreateOpLowering : public OpRewritePattern<yul::CreateOp> {
428620
using OpRewritePattern<yul::CreateOp>::OpRewritePattern;
429621

@@ -652,6 +844,25 @@ struct BuiltinCallOpLowering : public OpRewritePattern<yul::CallOp> {
652844
}
653845
};
654846

847+
struct CallCodeOpLowering : public OpRewritePattern<yul::CallCodeOp> {
848+
using OpRewritePattern<yul::CallCodeOp>::OpRewritePattern;
849+
850+
LogicalResult matchAndRewrite(yul::CallCodeOp op,
851+
PatternRewriter &r) const override {
852+
evm::Builder evmB(r, op.getLoc());
853+
854+
r.replaceOpWithNewOp<LLVM::IntrCallOp>(
855+
op, llvm::Intrinsic::evm_callcode,
856+
/*resTy=*/r.getIntegerType(256),
857+
/*ins=*/
858+
ValueRange{op.getGas(), op.getAddress(), op.getValue(),
859+
evmB.genHeapPtr(op.getInpOffset()), op.getInpSize(),
860+
evmB.genHeapPtr(op.getOutOffset()), op.getOutSize()},
861+
"evm.callcode");
862+
return success();
863+
}
864+
};
865+
655866
struct StaticCallOpLowering : public OpRewritePattern<yul::StaticCallOp> {
656867
using OpRewritePattern<yul::StaticCallOp>::OpRewritePattern;
657868

@@ -795,8 +1006,22 @@ void evm::populateYulPats(RewritePatternSet &pats) {
7951006
SignExtendOpLowering,
7961007
LogOpLowering,
7971008
AddressOpLowering,
1009+
BalanceOpLowering,
1010+
SelfBalanceOpLowering,
7981011
CallerOpLowering,
7991012
GasOpLowering,
1013+
ChainIdOpLowering,
1014+
BaseFeeOpLowering,
1015+
BlobBaseFeeOpLowering,
1016+
OriginOpLowering,
1017+
GasPriceOpLowering,
1018+
BlockHashOpLowering,
1019+
BlobHashOpLowering,
1020+
CoinBaseOpLowering,
1021+
TimeStampOpLowering,
1022+
NumberOpLowering,
1023+
PrevrandaoOpLowering,
1024+
GasLimitOpLowering,
8001025
RevertOpLowering,
8011026
StopOpLowering,
8021027
CallValOpLowering,
@@ -815,6 +1040,7 @@ void evm::populateYulPats(RewritePatternSet &pats) {
8151040
CodeCopyOpLowering,
8161041
ExtCodeSizeOpLowering,
8171042
ExtCodeCopyOpLowering,
1043+
ExtCodeHashOpLowering,
8181044
CreateOpLowering,
8191045
Create2OpLowering,
8201046
MLoadOpLowering,
@@ -828,6 +1054,7 @@ void evm::populateYulPats(RewritePatternSet &pats) {
8281054
MCopyOpLowering,
8291055
MemGuardOpLowering,
8301056
BuiltinCallOpLowering,
1057+
CallCodeOpLowering,
8311058
StaticCallOpLowering,
8321059
DelegateCallOpLowering,
8331060
BuiltinRetOpLowering,

0 commit comments

Comments
 (0)