Skip to content

Commit 642e6ba

Browse files
authored
[SOL] Expand memcmp earlier (#172)
1 parent 7849671 commit 642e6ba

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

llvm/lib/Target/SBF/SBFTargetMachine.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#include "MCTargetDesc/SBFMCAsmInfo.h"
1314
#include "SBF.h"
15+
#include "SBFFunctionInfo.h"
1416
#include "SBFTargetMachine.h"
1517
#include "SBFTargetTransformInfo.h"
16-
#include "SBFFunctionInfo.h"
17-
#include "MCTargetDesc/SBFMCAsmInfo.h"
1818
#include "TargetInfo/SBFTargetInfo.h"
19+
#include "llvm/CodeGen/ExpandMemCmp.h"
1920
#include "llvm/CodeGen/Passes.h"
2021
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
2122
#include "llvm/CodeGen/TargetPassConfig.h"
2223
#include "llvm/IR/PassManager.h"
2324
#include "llvm/MC/TargetRegistry.h"
2425
#include "llvm/Passes/PassBuilder.h"
2526
#include "llvm/Target/TargetOptions.h"
27+
#include "llvm/Transforms/InstCombine/InstCombine.h"
2628
#include "llvm/Transforms/Scalar.h"
2729
#include "llvm/Transforms/Scalar/SimplifyCFG.h"
2830
#include "llvm/Transforms/Utils/SimplifyCFGOptions.h"
@@ -117,6 +119,8 @@ void SBFTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
117119
});
118120
PB.registerPeepholeEPCallback([=](FunctionPassManager &FPM,
119121
OptimizationLevel Level) {
122+
FPM.addPass(ExpandMemCmpPass(this));
123+
FPM.addPass(InstCombinePass());
120124
FPM.addPass(SimplifyCFGPass(
121125
SimplifyCFGOptions().hoistCommonInsts(true).convertSwitchToLookupTable(
122126
true)));

llvm/lib/Target/SBF/SBFTargetTransformInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class SBFTTIImpl : public BasicTTIImplBase<SBFTTIImpl> {
8787
TTI::MemCmpExpansionOptions Options;
8888
Options.LoadSizes = {8, 4, 2, 1};
8989
Options.MaxNumLoads = TLI->getMaxExpandSizeMemcmp(OptSize);
90+
Options.AllowOverlappingLoads = true;
9091
return Options;
9192
}
9293

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
; RUN: opt -O2 -S < %s | FileCheck %s
2+
3+
target datalayout = "e-m:e-p:64:64-i64:64-n32:64-S128"
4+
target triple = "sbf"
5+
6+
; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
7+
declare i32 @memcmp(ptr nocapture, ptr nocapture, i64) local_unnamed_addr
8+
9+
; The memcmp is expanded with an overlaping load
10+
define i1 @yes_expand(ptr %a, ptr %b) {
11+
entry:
12+
%res = call i32 @memcmp(ptr %a, ptr %b, i64 15)
13+
%is_zero = icmp eq i32 %res, 0
14+
ret i1 %is_zero
15+
16+
; CHECK: entry:
17+
; CHECK: %0 = load i64, ptr %a, align 1
18+
; CHECK: %1 = load i64, ptr %b, align 1
19+
; CHECK: %.not = icmp eq i64 %0, %1
20+
; CHECK: br i1 %.not, label %loadbb1, label %res_block
21+
22+
; CHECK: res_block:
23+
; CHECK: br label %endblock
24+
25+
; CHECK: loadbb1:
26+
; CHECK: %2 = getelementptr i8, ptr %a, i64 7
27+
; CHECK: %3 = getelementptr i8, ptr %b, i64 7
28+
; CHECK: %4 = load i64, ptr %2, align 1
29+
; CHECK: %5 = load i64, ptr %3, align 1
30+
; CHECK: %.not2 = icmp eq i64 %4, %5
31+
; CHECK: br i1 %.not2, label %endblock, label %res_block
32+
33+
; CHECK: endblock:
34+
; CHECK: %is_zero = phi i1 [ true, %loadbb1 ], [ false, %res_block ]
35+
; CHECK: ret i1 %is_zero
36+
}

0 commit comments

Comments
 (0)