Skip to content

Commit 4f5a672

Browse files
committed
Revert "[EVM] Improve code generation for conditional jumps"
This reverts commit 1df3586.
1 parent b32c5cc commit 4f5a672

File tree

8 files changed

+41
-198
lines changed

8 files changed

+41
-198
lines changed

llvm/lib/Target/EVM/CMakeLists.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,17 @@ add_llvm_target(EVMCodeGen
3636
EVMMachineFunctionInfo.cpp
3737
EVMMarkRecursiveFunctions.cpp
3838
EVMMCInstLower.cpp
39-
EVMMachineFunctionInfo.cpp
4039
EVMOptimizeLiveIntervals.cpp
4140
EVMRegColoring.cpp
4241
EVMRegisterInfo.cpp
4342
EVMSHA3ConstFolding.cpp
4443
EVMSingleUseExpression.cpp
4544
EVMSplitCriticalEdges.cpp
46-
EVMStackModel.cpp
47-
EVMStackShuffler.cpp
4845
EVMStackSolver.cpp
46+
EVMStackModel.cpp
4947
EVMStackify.cpp
5048
EVMStackifyCodeEmitter.cpp
49+
EVMStackShuffler.cpp
5150
EVMSubtarget.cpp
5251
EVMTargetMachine.cpp
5352
EVMTargetTransformInfo.cpp
@@ -70,6 +69,8 @@ add_llvm_target(EVMCodeGen
7069
Target
7170
TargetParser
7271
TransformUtils
72+
EVMDesc
73+
EVMInfo
7374

7475
ADD_TO_COMPONENT
7576
EVM

llvm/lib/Target/EVM/EVMInstrInfo.td

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -421,17 +421,10 @@ 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-
431424
def : Pat<(brcond (setcc GPR:$src, 0, SETEQ), bb:$dst),
432425
(JUMP_UNLESS bb:$dst, GPR:$src)>;
433-
def : Pat<(brcond (setcc GPR:$src, -1, SETGT), bb:$dst),
434-
(JUMP_UNLESS bb:$dst, (LT GPR:$src, (CONST_I256 0)))>;
426+
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETNE), bb:$dst),
427+
(JUMP_UNLESS bb:$dst, (EQ GPR:$rs0, GPR:$rs1))>;
435428
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETGE), bb:$dst),
436429
(JUMP_UNLESS bb:$dst, (LT GPR:$rs0, GPR:$rs1))>;
437430
def : Pat<(brcond (setcc GPR:$rs0, GPR:$rs1, SETLE), bb:$dst),

llvm/lib/Target/EVM/EVMLowerJumpUnless.cpp

Lines changed: 14 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,14 @@
1414
#include "EVMMachineFunctionInfo.h"
1515
#include "EVMSubtarget.h"
1616
#include "MCTargetDesc/EVMMCTargetDesc.h"
17-
#include "llvm/ADT/Statistic.h"
1817
#include "llvm/CodeGen/MachineFunctionPass.h"
1918
#include "llvm/CodeGen/MachineInstrBuilder.h"
20-
#include "llvm/Support/CodeGen.h"
21-
#include "llvm/Target/TargetMachine.h"
22-
#include "llvm/Target/TargetOptions.h"
2319

2420
using namespace llvm;
2521

2622
#define DEBUG_TYPE "evm-lower-jump-unless"
2723
#define EVM_LOWER_JUMP_UNLESS_NAME "EVM Lower jump_unless"
2824

29-
STATISTIC(NumPseudoJumpUnlessFolded, "Number of PseudoJUMP_UNLESS folded");
30-
3125
namespace {
3226
class EVMLowerJumpUnless final : public MachineFunctionPass {
3327
public:
@@ -72,51 +66,14 @@ static void lowerJumpUnless(MachineInstr &MI, const EVMInstrInfo *TII,
7266
.addReg(NewReg);
7367
}
7468

75-
/// Fold `<PrevMI> ; PseudoJUMP_UNLESS` into `PseudoJUMPI`.
76-
///
77-
/// Supported `PrevMI` patterns and changes:
78-
/// • `ISZERO_S` -> delete `ISZERO_S`
79-
/// • `EQ_S` -> change to `SUB_S`
80-
/// • `SUB_S` -> change to `EQ_S`
81-
///
82-
/// Returns `true` if any fold was performed.
83-
static bool tryFoldJumpUnless(MachineInstr &MI, const EVMInstrInfo *TII) {
84-
auto I = MachineBasicBlock::iterator(&MI);
85-
auto *PrevMI = I == MI.getParent()->begin() ? nullptr : &*std::prev(I);
86-
bool CanFold = PrevMI && (PrevMI->getOpcode() == EVM::ISZERO_S ||
87-
PrevMI->getOpcode() == EVM::EQ_S ||
88-
PrevMI->getOpcode() == EVM::SUB_S);
89-
90-
if (!CanFold)
91-
return false;
92-
93-
++NumPseudoJumpUnlessFolded;
94-
95-
if (PrevMI->getOpcode() == EVM::ISZERO_S)
96-
PrevMI->eraseFromParent();
97-
else if (PrevMI->getOpcode() == EVM::EQ_S)
98-
PrevMI->setDesc(TII->get(EVM::SUB_S));
99-
else if (PrevMI->getOpcode() == EVM::SUB_S)
100-
PrevMI->setDesc(TII->get(EVM::EQ_S));
101-
return true;
102-
}
103-
104-
/// Lower a `PseudoJUMP_UNLESS` to condition-setting + `PseudoJUMPI`.
105-
///
106-
/// If `FoldJumps` is enabled and the local pattern allows it, an
107-
/// optimisation in `tryFoldJumpUnless` removes the explicit `ISZERO_S`.
108-
/// Otherwise the pseudo-op expands to:
109-
/// ISZERO_S
110-
/// PseudoJUMPI
69+
// Lower pseudo jump_unless into iszero and jumpi instructions. This pseudo
70+
// instruction can only be present in stackified functions.
11171
static void lowerPseudoJumpUnless(MachineInstr &MI, const EVMInstrInfo *TII,
112-
const bool IsStackified,
113-
const bool FoldJumps) {
72+
const bool IsStackified) {
11473
assert(IsStackified && "Found pseudo jump_unless in non-stackified function");
11574
assert(MI.getNumExplicitOperands() == 1 &&
11675
"Unexpected number of operands in pseudo jump_unless");
117-
118-
if (!FoldJumps || !tryFoldJumpUnless(MI, TII))
119-
BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), TII->get(EVM::ISZERO_S));
76+
BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), TII->get(EVM::ISZERO_S));
12077
BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), TII->get(EVM::PseudoJUMPI))
12178
.add(MI.getOperand(0));
12279
}
@@ -127,32 +84,24 @@ bool EVMLowerJumpUnless::runOnMachineFunction(MachineFunction &MF) {
12784
<< "********** Function: " << MF.getName() << '\n';
12885
});
12986

130-
CodeGenOptLevel OptLevel = MF.getTarget().getOptLevel();
13187
MachineRegisterInfo &MRI = MF.getRegInfo();
13288
const auto *TII = MF.getSubtarget<EVMSubtarget>().getInstrInfo();
13389
const bool IsStackified =
13490
MF.getInfo<EVMMachineFunctionInfo>()->getIsStackified();
13591

13692
bool Changed = false;
13793
for (MachineBasicBlock &MBB : MF) {
138-
auto TermIt = MBB.getFirstInstrTerminator();
139-
if (TermIt == MBB.end())
140-
continue;
141-
142-
switch (TermIt->getOpcode()) {
143-
case EVM::PseudoJUMP_UNLESS:
144-
lowerPseudoJumpUnless(*TermIt, TII, IsStackified,
145-
OptLevel != CodeGenOptLevel::None);
146-
break;
147-
case EVM::JUMP_UNLESS:
148-
lowerJumpUnless(*TermIt, TII, IsStackified, MRI);
149-
break;
150-
default:
151-
continue;
94+
for (auto &MI : make_early_inc_range(MBB)) {
95+
if (MI.getOpcode() == EVM::PseudoJUMP_UNLESS)
96+
lowerPseudoJumpUnless(MI, TII, IsStackified);
97+
else if (MI.getOpcode() == EVM::JUMP_UNLESS)
98+
lowerJumpUnless(MI, TII, IsStackified, MRI);
99+
else
100+
continue;
101+
102+
MI.eraseFromParent();
103+
Changed = true;
152104
}
153-
154-
TermIt->eraseFromParent();
155-
Changed = true;
156105
}
157106
return Changed;
158107
}

llvm/lib/Target/EVM/EVMTargetMachine.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,10 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeEVMTarget() {
4848
// Register the target.
4949
const RegisterTargetMachine<EVMTargetMachine> X(getTheEVMTarget());
5050
auto &PR = *PassRegistry::getPassRegistry();
51-
initializeEVMAAWrapperPassPass(PR);
52-
initializeEVMAllocaHoistingPass(PR);
53-
initializeEVMBPStackificationPass(PR);
5451
initializeEVMCodegenPreparePass(PR);
55-
initializeEVMExternalAAWrapperPass(PR);
52+
initializeEVMAllocaHoistingPass(PR);
5653
initializeEVMLinkRuntimePass(PR);
5754
initializeEVMLowerIntrinsicsPass(PR);
58-
initializeEVMLowerJumpUnlessPass(PR);
5955
initializeEVMOptimizeLiveIntervalsPass(PR);
6056
initializeEVMRegColoringPass(PR);
6157
initializeEVMSingleUseExpressionPass(PR);

llvm/test/CodeGen/EVM/br.ll

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

llvm/test/CodeGen/EVM/brcond.ll

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ define void @br_eq(i256 %a, i256 %b) {
1212
; CHECK-NEXT: JUMPDEST
1313
; CHECK-NEXT: SWAP2
1414
; CHECK-NEXT: POP
15-
; CHECK-NEXT: SUB
15+
; CHECK-NEXT: EQ
16+
; CHECK-NEXT: ISZERO
1617
; CHECK-NEXT: PUSH4 @.BB0_2
1718
; CHECK-NEXT: JUMPI
1819
; CHECK-NEXT: ; %bb.1: ; %true
@@ -226,6 +227,9 @@ define void @br_eq_0(i256 %a) {
226227
; CHECK-NEXT: JUMPDEST
227228
; CHECK-NEXT: SWAP1
228229
; CHECK-NEXT: POP
230+
; CHECK-NEXT: PUSH0
231+
; CHECK-NEXT: EQ
232+
; CHECK-NEXT: ISZERO
229233
; CHECK-NEXT: PUSH4 @.BB10_2
230234
; CHECK-NEXT: JUMPI
231235
; CHECK-NEXT: ; %bb.1: ; %true
@@ -325,6 +329,9 @@ define void @br_ule_0(i256 %a) {
325329
; CHECK-NEXT: JUMPDEST
326330
; CHECK-NEXT: SWAP1
327331
; CHECK-NEXT: POP
332+
; CHECK-NEXT: PUSH0
333+
; CHECK-NEXT: EQ
334+
; CHECK-NEXT: ISZERO
328335
; CHECK-NEXT: PUSH4 @.BB15_2
329336
; CHECK-NEXT: JUMPI
330337
; CHECK-NEXT: ; %bb.1: ; %true
@@ -384,11 +391,13 @@ define void @br_slt_0(i256 %a) {
384391
; CHECK-LABEL: br_slt_0:
385392
; CHECK: ; %bb.0:
386393
; CHECK-NEXT: JUMPDEST
387-
; CHECK-NEXT: PUSH0
388-
; CHECK-NEXT: SWAP2
394+
; CHECK-NEXT: SWAP1
389395
; CHECK-NEXT: POP
390-
; CHECK-NEXT: SLT
391-
; CHECK-NEXT: ISZERO
396+
; CHECK-NEXT: PUSH1 0x1
397+
; CHECK-NEXT: PUSH0
398+
; CHECK-NEXT: SUB
399+
; CHECK-NEXT: SWAP1
400+
; CHECK-NEXT: SGT
392401
; CHECK-NEXT: PUSH4 @.BB18_2
393402
; CHECK-NEXT: JUMPI
394403
; CHECK-NEXT: ; %bb.1: ; %true

llvm/test/CodeGen/EVM/lower-jump-unless.mir

Lines changed: 0 additions & 108 deletions
This file was deleted.

llvm/test/CodeGen/EVM/select.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ 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
1517
; CHECK-NEXT: PUSH4 @.BB0_2
1618
; CHECK-NEXT: JUMPI
1719
; CHECK-NEXT: ; %bb.1:

0 commit comments

Comments
 (0)