Skip to content

Commit 4ed74e6

Browse files
authored
Merge pull request rust-lang#114 from ykjit/insert-stackmap-change
Don't add stackmap after unmappable functions.
2 parents f091357 + 1280b47 commit 4ed74e6

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ void initializeWasmEHPreparePass(PassRegistry&);
341341
void initializeWinEHPreparePass(PassRegistry&);
342342
void initializeWriteBitcodePassPass(PassRegistry&);
343343
void initializeXRayInstrumentationPass(PassRegistry&);
344+
void initializeYkStackmapsPass(PassRegistry&);
344345
void initializeYkSplitBlocksAfterCallsPass(PassRegistry&);
345346
void initializeYkBasicBlockTracerPass(PassRegistry&);
346347
} // end namespace llvm

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
150150
initializeWasmEHPreparePass(Registry);
151151
initializeWinEHPreparePass(Registry);
152152
initializeXRayInstrumentationPass(Registry);
153+
initializeYkStackmapsPass(Registry);
153154
initializeYkSplitBlocksAfterCallsPass(Registry);
154155
initializeYkBasicBlockTracerPass(Registry);
155156
}

llvm/lib/Transforms/Yk/StackMaps.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ class YkStackmaps : public ModulePass {
6060
// We don't need to insert stackmaps after intrinsics. But since we
6161
// can't tell if an indirect call is an intrinsic at compile time,
6262
// emit a stackmap in those cases too.
63-
if (!CI.isIndirectCall() && CI.getCalledFunction()->isIntrinsic())
63+
if (!CI.isIndirectCall() &&
64+
(CI.getCalledFunction()->isIntrinsic() ||
65+
CI.getCalledFunction()->isDeclaration()))
6466
continue;
6567
SMCalls.insert({&I, LA.getLiveVarsBefore(&I)});
6668
} else if ((isa<BranchInst>(I) &&
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
; RUN: llc -stop-after=yk-stackmaps --yk-insert-stackmaps < %s | FileCheck %s
2+
3+
; Check whether `llvm.experimental.stackmap` calls are only inserted after normal calls,
4+
; and not after external calls.
5+
6+
; CHECK-LABEL: define dso_local i32 @main
7+
; CHECK: %call = call i32 @foo(i32 noundef %0)
8+
; CHECK-NEXT: call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 0, ptr %argc.addr, ptr %a, ptr %b, i32 %0)
9+
; CHECK: %call1 = call i32 @foo(i32 noundef %1)
10+
; CHECK-NEXT: call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 0, ptr %argc.addr, ptr %a, ptr %b, i32 %1)
11+
; CHECK: %call2 = call i32 (ptr, ...) @printf(ptr noundef @.str, i32 noundef %2, i32 noundef %3, i32 noundef %4)
12+
; CHECK-NOT: call void (i64, i32, ...) @llvm.experimental.stackmap
13+
14+
@.str = private unnamed_addr constant [10 x i8] c"%d %d %d\0A\00", align 1
15+
16+
; Function Attrs: noinline nounwind uwtable
17+
define dso_local i32 @foo(i32 noundef %x) #0 {
18+
entry:
19+
%x.addr = alloca i32, align 4
20+
store i32 %x, ptr %x.addr, align 4
21+
%0 = load i32, ptr %x.addr, align 4
22+
%add = add nsw i32 %0, 10
23+
ret i32 %add
24+
}
25+
26+
; Function Attrs: noinline nounwind uwtable
27+
define dso_local i32 @main(i32 noundef %argc, ptr noundef %argv) #0 {
28+
entry:
29+
%retval = alloca i32, align 4
30+
%argc.addr = alloca i32, align 4
31+
%argv.addr = alloca ptr, align 8
32+
%a = alloca i32, align 4
33+
%b = alloca i32, align 4
34+
store i32 0, ptr %retval, align 4
35+
store i32 %argc, ptr %argc.addr, align 4
36+
store ptr %argv, ptr %argv.addr, align 8
37+
%0 = load i32, ptr %argc.addr, align 4
38+
%call = call i32 @foo(i32 noundef %0)
39+
store i32 %call, ptr %a, align 4
40+
%1 = load i32, ptr %a, align 4
41+
%call1 = call i32 @foo(i32 noundef %1)
42+
store i32 %call1, ptr %b, align 4
43+
%2 = load i32, ptr %argc.addr, align 4
44+
%3 = load i32, ptr %a, align 4
45+
%4 = load i32, ptr %b, align 4
46+
%call2 = call i32 (ptr, ...) @printf(ptr noundef @.str, i32 noundef %2, i32 noundef %3, i32 noundef %4)
47+
ret i32 0
48+
}
49+
50+
declare dso_local i32 @printf(ptr noundef, ...) #1
51+
52+
attributes #0 = { noinline nounwind uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
53+
attributes #1 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }

0 commit comments

Comments
 (0)