Skip to content

Commit c8c371f

Browse files
committed
Reduce comment, further simplify test
1 parent d0e4e68 commit c8c371f

File tree

2 files changed

+13
-44
lines changed

2 files changed

+13
-44
lines changed

clang/lib/CodeGen/CGCall.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6001,10 +6001,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
60016001
for (auto it = EHStack.find(CurrentCleanupScopeDepth); it != EHStack.end();
60026002
++it) {
60036003
EHCleanupScope *Cleanup = dyn_cast<EHCleanupScope>(&*it);
6004-
// Fake uses can be safely emitted immediately prior to the tail call; we
6005-
// choose to emit the fake use before the call rather than after, to avoid
6006-
// forcing variable values from every call on the "stack" to be preserved
6007-
// simultaneously.
6004+
// Fake uses can be safely emitted immediately prior to the tail call, so
6005+
// we choose to emit them just before the call here.
60086006
if (Cleanup && Cleanup->isFakeUse()) {
60096007
CGBuilderTy::InsertPointGuard IPG(Builder);
60106008
Builder.SetInsertPoint(CI);
Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,27 @@
1-
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
21
// RUN: %clang_cc1 -emit-llvm -fextend-variable-liveness -o - %s | FileCheck %s
32

43
/// Tests that when we have fake uses in a function ending in a musttail call,
54
/// we emit the fake uses and their corresponding loads immediately prior to the
65
/// tail call.
76

8-
extern "C" char *bar(int *, const char *, int *, const int *, unsigned long);
7+
extern "C" char *bar(int *);
98

109
// CHECK-LABEL: define dso_local ptr @foo(
11-
// CHECK-SAME: ptr noundef [[E:%.*]], ptr noundef [[F:%.*]], ptr noundef [[G:%.*]], ptr noundef [[H:%.*]], i64 noundef [[I:%.*]]) #[[ATTR0:[0-9]+]] {
10+
// CHECK-SAME: ptr noundef [[E:%.*]])
1211
// CHECK-NEXT: [[ENTRY:.*:]]
1312
// CHECK-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 8
14-
// CHECK-NEXT: [[F_ADDR:%.*]] = alloca ptr, align 8
15-
// CHECK-NEXT: [[G_ADDR:%.*]] = alloca ptr, align 8
16-
// CHECK-NEXT: [[H_ADDR:%.*]] = alloca ptr, align 8
17-
// CHECK-NEXT: [[I_ADDR:%.*]] = alloca i64, align 8
1813
// CHECK-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 8
19-
// CHECK-NEXT: store ptr [[F]], ptr [[F_ADDR]], align 8
20-
// CHECK-NEXT: store ptr [[G]], ptr [[G_ADDR]], align 8
21-
// CHECK-NEXT: store ptr [[H]], ptr [[H_ADDR]], align 8
22-
// CHECK-NEXT: store i64 [[I]], ptr [[I_ADDR]], align 8
2314
// CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 8
24-
// CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[F_ADDR]], align 8
25-
// CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G_ADDR]], align 8
26-
// CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[H_ADDR]], align 8
27-
// CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr [[I_ADDR]], align 8
28-
// CHECK-NEXT: [[FAKE_USE:%.*]] = load i64, ptr [[I_ADDR]], align 8
29-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(i64 [[FAKE_USE]]) #[[ATTR3:[0-9]+]]
30-
// CHECK-NEXT: [[FAKE_USE1:%.*]] = load ptr, ptr [[H_ADDR]], align 8
31-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE1]]) #[[ATTR3]]
32-
// CHECK-NEXT: [[FAKE_USE2:%.*]] = load ptr, ptr [[G_ADDR]], align 8
33-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE2]]) #[[ATTR3]]
34-
// CHECK-NEXT: [[FAKE_USE3:%.*]] = load ptr, ptr [[F_ADDR]], align 8
35-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE3]]) #[[ATTR3]]
36-
// CHECK-NEXT: [[FAKE_USE4:%.*]] = load ptr, ptr [[E_ADDR]], align 8
37-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE4]]) #[[ATTR3]]
38-
// CHECK-NEXT: [[CALL:%.*]] = musttail call ptr @bar(ptr noundef [[TMP0]], ptr noundef [[TMP1]], ptr noundef [[TMP2]], ptr noundef [[TMP3]], i64 noundef [[TMP4]])
15+
// CHECK-NEXT: [[FAKE_USE:%.*]] = load ptr, ptr [[E_ADDR]]
16+
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE]])
17+
// CHECK-NEXT: [[CALL:%.*]] = musttail call ptr @bar(ptr noundef [[TMP0]])
3918
// CHECK-NEXT: ret ptr [[CALL]]
40-
// CHECK: [[BB5:.*:]]
41-
// CHECK-NEXT: [[FAKE_USE5:%.*]] = load i64, ptr [[I_ADDR]], align 8
42-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(i64 [[FAKE_USE5]]) #[[ATTR3]]
43-
// CHECK-NEXT: [[FAKE_USE6:%.*]] = load ptr, ptr [[H_ADDR]], align 8
44-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE6]]) #[[ATTR3]]
45-
// CHECK-NEXT: [[FAKE_USE7:%.*]] = load ptr, ptr [[G_ADDR]], align 8
46-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE7]]) #[[ATTR3]]
47-
// CHECK-NEXT: [[FAKE_USE8:%.*]] = load ptr, ptr [[F_ADDR]], align 8
48-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE8]]) #[[ATTR3]]
49-
// CHECK-NEXT: [[FAKE_USE9:%.*]] = load ptr, ptr [[E_ADDR]], align 8
50-
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE9]]) #[[ATTR3]]
19+
20+
// CHECK: [[BB1:.*:]]
21+
// CHECK-NEXT: [[FAKE_USE1:%.*]] = load ptr, ptr [[E_ADDR]]
22+
// CHECK-NEXT: notail call void (...) @llvm.fake.use(ptr [[FAKE_USE1]])
5123
// CHECK-NEXT: ret ptr undef
5224
//
53-
extern "C" const char *foo(int *e, const char *f, int *g, const int *h,
54-
unsigned long i) {
55-
[[clang::musttail]] return bar(e, f, g, h, i);
25+
extern "C" const char *foo(int *e) {
26+
[[clang::musttail]] return bar(e);
5627
}

0 commit comments

Comments
 (0)