@@ -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+
177203struct 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+
202381struct 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+
427619struct 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+
655866struct 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