Skip to content

Commit 9ccfcb2

Browse files
committed
[EVM] Run some opt passes at the beginning of codegen pipeline
This includes early-cse, gvn, dse, simplifycfg and passes that optimize GEP instructions.
1 parent 9561c2a commit 9ccfcb2

16 files changed

+330
-97
lines changed

llvm/lib/Analysis/MemoryLocation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ MemoryLocation MemoryLocation::getForArgument(const CallBase *Call,
190190
case Intrinsic::memcpy_inline:
191191
case Intrinsic::memmove:
192192
case Intrinsic::memset:
193+
case Intrinsic::evm_memmoveas1as1:
194+
case Intrinsic::evm_memcpyas1as2:
195+
case Intrinsic::evm_memcpyas1as3:
196+
case Intrinsic::evm_memcpyas1as4:
193197
if (ConstantInt *LenCI = dyn_cast<ConstantInt>(II->getArgOperand(2)))
194198
if (LenCI->getValue().getActiveBits() > 64)
195199
return MemoryLocation::getAfter(Arg, AATags);

llvm/lib/Target/EVM/EVMTargetMachine.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,16 @@
2525
#include "llvm/InitializePasses.h"
2626
#include "llvm/MC/TargetRegistry.h"
2727
#include "llvm/Passes/PassBuilder.h"
28+
#include "llvm/Transforms/IPO.h"
2829
#include "llvm/Transforms/IPO/GlobalDCE.h"
30+
#include "llvm/Transforms/InstCombine/InstCombine.h"
31+
#include "llvm/Transforms/Scalar.h"
32+
#include "llvm/Transforms/Scalar/DeadStoreElimination.h"
33+
#include "llvm/Transforms/Scalar/EarlyCSE.h"
34+
#include "llvm/Transforms/Scalar/GVN.h"
2935
#include "llvm/Transforms/Scalar/MergeIdenticalBB.h"
36+
#include "llvm/Transforms/Scalar/NewGVN.h"
37+
#include "llvm/Transforms/Scalar/SimplifyCFG.h"
3038
#include "llvm/Transforms/Utils.h"
3139

3240
using namespace llvm;
@@ -141,6 +149,14 @@ void EVMTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
141149
FAM.registerPass([] { return EVMAA(); });
142150
});
143151

152+
PB.registerOptimizerLastEPCallback(
153+
[](ModulePassManager &PM, OptimizationLevel Level) {
154+
if (Level != OptimizationLevel::O0)
155+
// Earlier transformations may expose new opportunities for DSE,
156+
// so we run it again.
157+
PM.addPass(createModuleToFunctionPassAdaptor(DSEPass()));
158+
});
159+
144160
PB.registerPipelineParsingCallback(
145161
[](StringRef PassName, ModulePassManager &PM,
146162
ArrayRef<PassBuilder::PipelineElement>) {
@@ -211,6 +227,17 @@ class EVMPassConfig final : public TargetPassConfig {
211227
void EVMPassConfig::addIRPasses() {
212228
addPass(createEVMLowerIntrinsicsPass());
213229
if (TM->getOptLevel() != CodeGenOptLevel::None) {
230+
// Call EarlyCSE pass to find and remove subexpressions in the lowered
231+
// result.
232+
addPass(createEarlyCSEPass(true));
233+
addPass(createGVNPass());
234+
// The DSE pass we run at the end of the optimization pipeline may open
235+
// up new opportunities for further CFG simplification.
236+
addPass(createCFGSimplificationPass(SimplifyCFGOptions()
237+
.convertSwitchRangeToICmp(true)
238+
.hoistCommonInsts(true)
239+
.sinkCommonInsts(true)));
240+
addPass(createLICMPass());
214241
addPass(createEVMAAWrapperPass());
215242
addPass(createEVMExternalAAWrapperPass());
216243
}

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,45 @@ target triple = "evm"
99
; CHECK-NEXT: Target Pass Configuration
1010
; CHECK-NEXT: Machine Module Information
1111
; CHECK-NEXT: Target Transform Information
12+
; CHECK-NEXT: Assumption Cache Tracker
13+
; CHECK-NEXT: Profile summary info
1214
; CHECK-NEXT: EVM Address space based Alias Analysis
1315
; CHECK-NEXT: EVM Address space based Alias Analysis Wrapper
1416
; CHECK-NEXT: Type-Based Alias Analysis
1517
; CHECK-NEXT: Scoped NoAlias Alias Analysis
16-
; CHECK-NEXT: Assumption Cache Tracker
17-
; CHECK-NEXT: Profile summary info
1818
; CHECK-NEXT: Create Garbage Collector Module Metadata
1919
; CHECK-NEXT: Machine Branch Probability Analysis
2020
; CHECK-NEXT: ModulePass Manager
2121
; CHECK-NEXT: Pre-ISel Intrinsic Lowering
2222
; CHECK-NEXT: EVM Lower Intrinsics
2323
; CHECK-NEXT: FunctionPass Manager
24-
; CHECK-NEXT: Module Verifier
25-
; CHECK-NEXT: Dominator Tree Construction
26-
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
27-
; CHECK-NEXT: Natural Loop Information
28-
; CHECK-NEXT: Canonicalize natural loops
29-
; CHECK-NEXT: Scalar Evolution Analysis
30-
; CHECK-NEXT: Loop Pass Manager
24+
; CHECK-NEXT: Dominator Tree Construction
25+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
26+
; CHECK-NEXT: Function Alias Analysis Results
27+
; CHECK-NEXT: Memory SSA
28+
; CHECK-NEXT: Early CSE w/ MemorySSA
29+
; CHECK-NEXT: Natural Loop Information
30+
; CHECK-NEXT: Memory Dependence Analysis
31+
; CHECK-NEXT: Lazy Branch Probability Analysis
32+
; CHECK-NEXT: Lazy Block Frequency Analysis
33+
; CHECK-NEXT: Optimization Remark Emitter
34+
; CHECK-NEXT: Global Value Numbering
35+
; CHECK-NEXT: Simplify the CFG
36+
; CHECK-NEXT: Dominator Tree Construction
37+
; CHECK-NEXT: Basic Alias Analysis (stateless AA impl)
38+
; CHECK-NEXT: Function Alias Analysis Results
39+
; CHECK-NEXT: Memory SSA
40+
; CHECK-NEXT: Natural Loop Information
41+
; CHECK-NEXT: Canonicalize natural loops
42+
; CHECK-NEXT: LCSSA Verifier
43+
; CHECK-NEXT: Loop-Closed SSA Form Pass
44+
; CHECK-NEXT: Scalar Evolution Analysis
45+
; CHECK-NEXT: Lazy Branch Probability Analysis
46+
; CHECK-NEXT: Lazy Block Frequency Analysis
47+
; CHECK-NEXT: Loop Pass Manager
48+
; CHECK-NEXT: Loop Invariant Code Motion
49+
; CHECK-NEXT: Module Verifier
50+
; CHECK-NEXT: Loop Pass Manager
3151
; CHECK-NEXT: Canonicalize Freeze Instructions in Loops
3252
; CHECK-NEXT: Induction Variable Users
3353
; CHECK-NEXT: Loop Strength Reduction

llvm/test/CodeGen/EVM/br.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@ target triple = "evm"
66

77
define i256 @diamond(i256 %rs1, i256 %rs2) nounwind {
88
; CHECK-LABEL: diamond:
9-
; CHECK: ; %bb.0:
9+
; CHECK: ; %bb.0: ; %end_bb
1010
; CHECK-NEXT: JUMPDEST
11-
; CHECK-NEXT: DUP1
12-
; CHECK-NEXT: DUP3
11+
; CHECK-NEXT: DUP2
12+
; CHECK-NEXT: DUP2
1313
; CHECK-NEXT: SUB
1414
; CHECK-NEXT: PUSH4 @.BB0_2
1515
; CHECK-NEXT: JUMPI
16-
; CHECK-NEXT: ; %bb.1: ; %true_bb
16+
; CHECK-NEXT: ; %bb.1:
1717
; CHECK-NEXT: DUP1
1818
; CHECK-NEXT: SWAP2
1919
; CHECK-NEXT: POP
2020
; CHECK-NEXT: MUL
2121
; CHECK-NEXT: PUSH4 @.BB0_3
2222
; CHECK-NEXT: JUMP
23-
; CHECK-NEXT: .BB0_2: ; %false_bb
23+
; CHECK-NEXT: .BB0_2: ; %end_bb
2424
; CHECK-NEXT: JUMPDEST
2525
; CHECK-NEXT: ADD
2626
; CHECK-NEXT: .BB0_3: ; %end_bb

llvm/test/CodeGen/EVM/branch-folder-after-stackification.ll

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,22 @@ define i256 @test(i256 %arg) {
88
; CHECK-LABEL: test:
99
; CHECK: ; %bb.0: ; %entry
1010
; CHECK-NEXT: JUMPDEST
11+
; CHECK-NEXT: PUSH1 0xA
1112
; CHECK-NEXT: PUSH0
12-
; CHECK-NEXT: DUP2
13+
; CHECK-NEXT: DUP3
1314
; CHECK-NEXT: SLT
14-
; CHECK-NEXT: PUSH4 @.BB0_2
15-
; CHECK-NEXT: JUMPI
16-
; CHECK-NEXT: ; %bb.1:
17-
; CHECK-NEXT: PUSH1 0x1
15+
; CHECK-NEXT: MUL
1816
; CHECK-NEXT: PUSH1 0x14
19-
; CHECK-NEXT: PUSH4 @.BB0_3
20-
; CHECK-NEXT: JUMP
21-
; CHECK-NEXT: .BB0_2: ; %bb1
22-
; CHECK-NEXT: JUMPDEST
23-
; CHECK-NEXT: PUSH1 0x1
24-
; CHECK-NEXT: PUSH1 0xA
25-
; CHECK-NEXT: .BB0_3: ; %bb2
26-
; CHECK-NEXT: JUMPDEST
27-
; CHECK-NEXT: SWAP2
28-
; CHECK-NEXT: SLT
29-
; CHECK-NEXT: PUSH4 @.BB0_5
30-
; CHECK-NEXT: JUMPI
31-
; CHECK-NEXT: ; %bb.4: ; %bb3
32-
; CHECK-NEXT: POP
17+
; CHECK-NEXT: SUB
18+
; CHECK-NEXT: SWAP1
19+
; CHECK-NEXT: PUSH0
20+
; CHECK-NEXT: DUP3
3321
; CHECK-NEXT: PUSH1 0x5
34-
; CHECK-NEXT: .BB0_5: ; %bb4
35-
; CHECK-NEXT: JUMPDEST
22+
; CHECK-NEXT: SUB
23+
; CHECK-NEXT: SWAP2
24+
; CHECK-NEXT: SGT
25+
; CHECK-NEXT: MUL
26+
; CHECK-NEXT: ADD
3627
; CHECK-NEXT: SWAP1
3728
; CHECK-NEXT: JUMP
3829
entry:

0 commit comments

Comments
 (0)