Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/CodeGenFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,8 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {

PopCleanupBlocks(PrologueCleanupDepth, {}, CompilingCilk);
SyncEmitted = true;
} else if (CompilingCilk && Builder.GetInsertBlock()) {
} else if (CompilingCilk && Builder.GetInsertBlock() &&
ReturnBlock.getBlock()->use_empty()) {
// If we're compiling Cilk, emit an implicit sync for the function.
EmitImplicitSyncCleanup();
SyncEmitted = true;
Expand Down
43 changes: 43 additions & 0 deletions clang/test/Cilk/early-return-while.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// RUN: %clang_cc1 %s -triple x86_64-unknown-linux-gnu -fcilkplus -verify -ftapir=none -S -emit-llvm -o - | FileCheck %s
// expected-no-diagnostics

void bar();
int baz(int);

void foo(int p) {
while (p) {
if (baz(p))
return;
_Cilk_spawn bar();
--p;
}
bar();
}

// CHECK-LABEL: define {{.*}}void @foo(

// CHECK: br i1 %{{.+}}, label %[[WHILE_BODY:.+]], label %[[WHILE_END:.+]]

// CHECK: [[WHILE_BODY]]:
// CHECK: br i1 %{{.+}}, label %[[THEN:.+]], label %[[END:.+]]

// CHECK: [[THEN]]:
// CHECK-NEXT: br label %[[RETURN:.+]]

// CHECK: detach within %[[SYNCREG:.+]], label %[[DETACHED:.+]], label %[[CONTINUE:.+]]

// CHECK: [[DETACHED]]:
// CHECK: call void {{.*}}@bar()
// CHECK: reattach within %[[SYNCREG]], label %[[CONTINUE]]

// CHECK: [[CONTINUE]]:
// CHECK: br

// CHECK: [[WHILE_END]]:
// CHECK-NEXT: call void {{.*}}@bar()
// CHECK-NEXT: br label %[[RETURN]]

// CHECK: [[RETURN]]:
// CHECK-NEXT: sync within %[[SYNCREG]]

// CHECK: ret void
3 changes: 2 additions & 1 deletion clang/test/Cilk/early-return.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ void foo(int p) {

// CHECK: [[END]]:
// CHECK-NEXT: call void {{.*}}@bar()
// CHECK-NEXT: sync within %[[SYNCREG]]

// CHECK: sync within %[[SYNCREG]]

// CHECK: ret void

Original file line number Diff line number Diff line change
Expand Up @@ -842,6 +842,7 @@ POST_SYSCALL(statfs)(long res, const void *path, void *buf) {
}
}

#if !SANITIZER_MAC
PRE_SYSCALL(statfs64)(const void *path, long sz, void *buf) {
if (path)
PRE_READ(path, __sanitizer::internal_strlen((const char *)path) + 1);
Expand All @@ -852,6 +853,7 @@ POST_SYSCALL(statfs64)(long res, const void *path, long sz, void *buf) {
if (buf) POST_WRITE(buf, struct_statfs64_sz);
}
}
#endif

PRE_SYSCALL(fstatfs)(long fd, void *buf) {}

Expand All @@ -861,13 +863,15 @@ POST_SYSCALL(fstatfs)(long res, long fd, void *buf) {
}
}

#if !SANITIZER_MAC
PRE_SYSCALL(fstatfs64)(long fd, long sz, void *buf) {}

POST_SYSCALL(fstatfs64)(long res, long fd, long sz, void *buf) {
if (res >= 0) {
if (buf) POST_WRITE(buf, struct_statfs64_sz);
}
}
#endif
#endif // !SANITIZER_ANDROID

PRE_SYSCALL(lstat)(const void *filename, void *statbuf) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@
#define SANITIZER_INTERCEPT_STATFS \
(SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
#define SANITIZER_INTERCEPT_STATFS64 \
((SI_MAC && !SI_IOS) || SI_LINUX_NOT_ANDROID)
(SI_LINUX_NOT_ANDROID)
#define SANITIZER_INTERCEPT_STATVFS \
(SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID)
#define SANITIZER_INTERCEPT_STATVFS64 SI_LINUX_NOT_ANDROID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,9 @@ typedef struct user_fpregs elf_fpregset_t;
namespace __sanitizer {
unsigned struct_utsname_sz = sizeof(struct utsname);
unsigned struct_stat_sz = sizeof(struct stat);
#if !SANITIZER_IOS
#if !SANITIZER_MAC
unsigned struct_stat64_sz = sizeof(struct stat64);
#endif // !SANITIZER_IOS
#endif // !SANITIZER_MAC
unsigned struct_rusage_sz = sizeof(struct rusage);
unsigned struct_tm_sz = sizeof(struct tm);
unsigned struct_passwd_sz = sizeof(struct passwd);
Expand All @@ -196,10 +196,6 @@ namespace __sanitizer {
unsigned struct_regex_sz = sizeof(regex_t);
unsigned struct_regmatch_sz = sizeof(regmatch_t);

#if SANITIZER_MAC && !SANITIZER_IOS
unsigned struct_statfs64_sz = sizeof(struct statfs64);
#endif // SANITIZER_MAC && !SANITIZER_IOS

#if !SANITIZER_ANDROID
unsigned struct_fstab_sz = sizeof(struct fstab);
unsigned struct_statfs_sz = sizeof(struct statfs);
Expand Down