Skip to content

Commit 7473e2b

Browse files
committed
[EVM] Restore peephole pass
1 parent 4f5a672 commit 7473e2b

File tree

9 files changed

+124
-22
lines changed

9 files changed

+124
-22
lines changed

llvm/lib/Target/EVM/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ add_llvm_target(EVMCodeGen
3737
EVMMarkRecursiveFunctions.cpp
3838
EVMMCInstLower.cpp
3939
EVMOptimizeLiveIntervals.cpp
40+
EVMPeephole.cpp
4041
EVMRegColoring.cpp
4142
EVMRegisterInfo.cpp
4243
EVMSHA3ConstFolding.cpp

llvm/lib/Target/EVM/EVM.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ FunctionPass *createEVMLowerJumpUnless();
7676
ModulePass *createEVMFinalizeStackFrames();
7777
ModulePass *createEVMMarkRecursiveFunctionsPass();
7878
FunctionPass *createEVMConstantUnfolding();
79+
FunctionPass *createEVMPeepholePass();
7980

8081
// PassRegistry initialization declarations.
8182
void initializeEVMCodegenPreparePass(PassRegistry &);
@@ -96,6 +97,7 @@ void initializeEVMLowerJumpUnlessPass(PassRegistry &);
9697
void initializeEVMFinalizeStackFramesPass(PassRegistry &);
9798
void initializeEVMMarkRecursiveFunctionsPass(PassRegistry &);
9899
void initializeEVMConstantUnfoldingPass(PassRegistry &);
100+
void initializeEVMPeepholePass(PassRegistry &);
99101

100102
struct EVMLinkRuntimePass : PassInfoMixin<EVMLinkRuntimePass> {
101103
EVMLinkRuntimePass() = default;

llvm/lib/Target/EVM/EVMInstrInfo.td

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,10 +421,17 @@ let isBarrier = 1 in {
421421
} // isBarrier = 1
422422
} // isBranch = 1, isTerminator = 1
423423

424+
def : Pat<(brcond (setcc GPR:$src, 0, SETNE), bb:$dst),
425+
(JUMPI bb:$dst, GPR:$src)>;
426+
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETEQ), bb:$dst),
427+
(JUMPI bb:$dst, (EQ GPR:$rs0, GPR:$rs1))>;
428+
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETNE), bb:$dst),
429+
(JUMPI bb:$dst, (SUB GPR:$rs1, GPR:$rs0))>;
430+
424431
def : Pat<(brcond (setcc GPR:$src, 0, SETEQ), bb:$dst),
425432
(JUMP_UNLESS bb:$dst, GPR:$src)>;
426-
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETNE), bb:$dst),
427-
(JUMP_UNLESS bb:$dst, (EQ GPR:$rs0, GPR:$rs1))>;
433+
def : Pat<(brcond (setcc GPR:$src, -1, SETGT), bb:$dst),
434+
(JUMP_UNLESS bb:$dst, (LT GPR:$src, (CONST_I256 0)))>;
428435
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETGE), bb:$dst),
429436
(JUMP_UNLESS bb:$dst, (LT GPR:$rs0, GPR:$rs1))>;
430437
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETLE), bb:$dst),
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// Pre-emission peephole optimizations.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "EVM.h"
14+
#include "MCTargetDesc/EVMMCTargetDesc.h"
15+
#include "llvm/CodeGen/MachineBasicBlock.h"
16+
#include "llvm/CodeGen/MachineFunctionPass.h"
17+
#include "llvm/CodeGen/MachineInstr.h"
18+
#include "llvm/CodeGen/MachineInstrBuilder.h"
19+
#include "llvm/CodeGen/TargetInstrInfo.h"
20+
#include "llvm/CodeGen/TargetSubtargetInfo.h"
21+
22+
#define DEBUG_TYPE "evm-peephole"
23+
#define EVM_PEEPHOLE "EVM Peephole"
24+
25+
using namespace llvm;
26+
27+
namespace {
28+
/// Perform foldings on stack-form MIR before emission.
29+
class EVMPeephole final : public MachineFunctionPass {
30+
public:
31+
static char ID;
32+
EVMPeephole() : MachineFunctionPass(ID) {}
33+
34+
StringRef getPassName() const override { return EVM_PEEPHOLE; }
35+
bool runOnMachineFunction(MachineFunction &MF) override;
36+
bool optimizeConditionaJumps(MachineBasicBlock &MBB) const;
37+
};
38+
} // namespace
39+
40+
bool EVMPeephole::runOnMachineFunction(MachineFunction &MF) {
41+
bool Changed = false;
42+
for (MachineBasicBlock &MBB : MF) {
43+
Changed |= optimizeConditionaJumps(MBB);
44+
}
45+
return Changed;
46+
}
47+
48+
static bool isNegatadAndJumpedOn(const MachineBasicBlock &MBB,
49+
MachineBasicBlock::const_iterator I) {
50+
if (I == MBB.end() || I->getOpcode() != EVM::ISZERO_S)
51+
return false;
52+
++I;
53+
if (I == MBB.end())
54+
return false;
55+
if (I->getOpcode() == EVM::PseudoJUMPI)
56+
return true;
57+
if (I->getOpcode() != EVM::PUSH4_S)
58+
return false;
59+
++I;
60+
return I != MBB.end() && I->getOpcode() == EVM::JUMPI;
61+
}
62+
63+
bool EVMPeephole::optimizeConditionaJumps(MachineBasicBlock &MBB) const {
64+
MachineBasicBlock::iterator I = MBB.begin();
65+
const TargetInstrInfo *TII = MBB.getParent()->getSubtarget().getInstrInfo();
66+
67+
while (I != MBB.end()) {
68+
// Fold ISZERO ISZERO to nothing, only if it's a predicate to JUMPI.
69+
if (I->getOpcode() == EVM::ISZERO_S &&
70+
isNegatadAndJumpedOn(MBB, std::next(I))) {
71+
std::next(I)->eraseFromParent();
72+
I->eraseFromParent();
73+
return true;
74+
}
75+
76+
// Fold EQ ISZERO to SUB, only if it's a predicate to JUMPI.
77+
if (I->getOpcode() == EVM::EQ_S &&
78+
isNegatadAndJumpedOn(MBB, std::next(I))) {
79+
I->setDesc(TII->get(EVM::SUB_S));
80+
std::next(I)->eraseFromParent();
81+
return true;
82+
}
83+
84+
// Fold SUB ISZERO to EQ, only if it's a predicate to JUMPI.
85+
if (I->getOpcode() == EVM::SUB_S &&
86+
isNegatadAndJumpedOn(MBB, std::next(I))) {
87+
I->setDesc(TII->get(EVM::EQ_S));
88+
std::next(I)->eraseFromParent();
89+
return true;
90+
}
91+
92+
++I;
93+
}
94+
return false;
95+
}
96+
97+
char EVMPeephole::ID = 0;
98+
99+
INITIALIZE_PASS(EVMPeephole, DEBUG_TYPE, EVM_PEEPHOLE, false, false)
100+
101+
FunctionPass *llvm::createEVMPeepholePass() { return new EVMPeephole(); }

llvm/lib/Target/EVM/EVMTargetMachine.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ void EVMPassConfig::addPreEmitPass() {
299299
void EVMPassConfig::addPreEmitPass2() {
300300
addPass(createEVMLowerJumpUnless());
301301
addPass(createEVMConstantUnfolding());
302+
if (getOptLevel() != CodeGenOptLevel::None)
303+
addPass(createEVMPeepholePass());
302304
}
303305

304306
TargetPassConfig *EVMTargetMachine::createPassConfig(PassManagerBase &PM) {

llvm/test/CodeGen/EVM/O3-pipeline.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ target triple = "evm"
148148
; CHECK-NEXT: MachineDominator Tree Construction
149149
; CHECK-NEXT: Machine Natural Loop Construction
150150
; CHECK-NEXT: EVM constant unfolding
151+
; CHECK-NEXT: EVM Peephole
151152
; CHECK-NEXT: Lazy Machine Block Frequency Analysis
152153
; CHECK-NEXT: Machine Optimization Remark Emitter
153154
; CHECK-NEXT: EVM Assembly

llvm/test/CodeGen/EVM/br.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ define i256 @diamond(i256 %rs1, i256 %rs2) nounwind {
88
; CHECK-LABEL: diamond:
99
; CHECK: ; %bb.0:
1010
; CHECK-NEXT: JUMPDEST
11-
; CHECK-NEXT: DUP2
12-
; CHECK-NEXT: DUP2
13-
; CHECK-NEXT: EQ
14-
; CHECK-NEXT: ISZERO
11+
; CHECK-NEXT: DUP1
12+
; CHECK-NEXT: DUP3
13+
; CHECK-NEXT: SUB
1514
; CHECK-NEXT: PUSH4 @.BB0_2
1615
; CHECK-NEXT: JUMPI
1716
; CHECK-NEXT: ; %bb.1: ; %true_bb

llvm/test/CodeGen/EVM/brcond.ll

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ define void @br_eq(i256 %a, i256 %b) {
1212
; CHECK-NEXT: JUMPDEST
1313
; CHECK-NEXT: SWAP2
1414
; CHECK-NEXT: POP
15-
; CHECK-NEXT: EQ
16-
; CHECK-NEXT: ISZERO
15+
; CHECK-NEXT: SUB
1716
; CHECK-NEXT: PUSH4 @.BB0_2
1817
; CHECK-NEXT: JUMPI
1918
; CHECK-NEXT: ; %bb.1: ; %true
@@ -227,9 +226,6 @@ define void @br_eq_0(i256 %a) {
227226
; CHECK-NEXT: JUMPDEST
228227
; CHECK-NEXT: SWAP1
229228
; CHECK-NEXT: POP
230-
; CHECK-NEXT: PUSH0
231-
; CHECK-NEXT: EQ
232-
; CHECK-NEXT: ISZERO
233229
; CHECK-NEXT: PUSH4 @.BB10_2
234230
; CHECK-NEXT: JUMPI
235231
; CHECK-NEXT: ; %bb.1: ; %true
@@ -329,9 +325,6 @@ define void @br_ule_0(i256 %a) {
329325
; CHECK-NEXT: JUMPDEST
330326
; CHECK-NEXT: SWAP1
331327
; CHECK-NEXT: POP
332-
; CHECK-NEXT: PUSH0
333-
; CHECK-NEXT: EQ
334-
; CHECK-NEXT: ISZERO
335328
; CHECK-NEXT: PUSH4 @.BB15_2
336329
; CHECK-NEXT: JUMPI
337330
; CHECK-NEXT: ; %bb.1: ; %true
@@ -391,13 +384,11 @@ define void @br_slt_0(i256 %a) {
391384
; CHECK-LABEL: br_slt_0:
392385
; CHECK: ; %bb.0:
393386
; CHECK-NEXT: JUMPDEST
394-
; CHECK-NEXT: SWAP1
395-
; CHECK-NEXT: POP
396-
; CHECK-NEXT: PUSH1 0x1
397387
; CHECK-NEXT: PUSH0
398-
; CHECK-NEXT: SUB
399-
; CHECK-NEXT: SWAP1
400-
; CHECK-NEXT: SGT
388+
; CHECK-NEXT: SWAP2
389+
; CHECK-NEXT: POP
390+
; CHECK-NEXT: SLT
391+
; CHECK-NEXT: ISZERO
401392
; CHECK-NEXT: PUSH4 @.BB18_2
402393
; CHECK-NEXT: JUMPI
403394
; CHECK-NEXT: ; %bb.1: ; %true

llvm/test/CodeGen/EVM/select.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ define i256 @select(i256 %v1, i256 %v2, i256 %v3, i256 %v4) {
1212
; CHECK-NEXT: SWAP1
1313
; CHECK-NEXT: SWAP3
1414
; CHECK-NEXT: EQ
15-
; CHECK-NEXT: ISZERO
16-
; CHECK-NEXT: ISZERO
1715
; CHECK-NEXT: PUSH4 @.BB0_2
1816
; CHECK-NEXT: JUMPI
1917
; CHECK-NEXT: ; %bb.1:

0 commit comments

Comments
 (0)