|
1 | | -// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 |
2 | 1 | // RUN: %clang_cc1 -emit-llvm -fextend-variable-liveness -o - %s | FileCheck %s |
3 | 2 |
|
4 | 3 | /// Tests that when we have fake uses in a function ending in a musttail call, |
5 | 4 | /// we emit the fake uses and their corresponding loads immediately prior to the |
6 | 5 | /// tail call. |
7 | 6 |
|
8 | | -extern "C" char *bar(int *, const char *, int *, const int *, unsigned long); |
| 7 | +extern "C" char *bar(int *); |
9 | 8 |
|
10 | 9 | // 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:%.*]]) |
12 | 11 | // CHECK-NEXT: [[ENTRY:.*:]] |
13 | 12 | // 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 |
18 | 13 | // 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 |
23 | 14 | // 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]]) |
39 | 18 | // 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]]) |
51 | 23 | // CHECK-NEXT: ret ptr undef |
52 | 24 | // |
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); |
56 | 27 | } |
0 commit comments