Commit 101b7745c4

Andrew Kelley <superjoe30@gmail.com>
2018-03-02 19:40:03
add optnone noinline to async functions
this works around LLVM optimization assertion failures. https://bugs.llvm.org/show_bug.cgi?id=36578 closes #800
1 parent 7d494b3
Changed files (2)
src/codegen.cpp
@@ -489,6 +489,10 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
     } else {
         LLVMSetFunctionCallConv(fn_table_entry->llvm_value, get_llvm_cc(g, fn_type->data.fn.fn_type_id.cc));
     }
+    if (fn_type->data.fn.fn_type_id.cc == CallingConventionAsync) {
+        addLLVMFnAttr(fn_table_entry->llvm_value, "optnone");
+        addLLVMFnAttr(fn_table_entry->llvm_value, "noinline");
+    }
 
     bool want_cold = fn_table_entry->is_cold || fn_type->data.fn.fn_type_id.cc == CallingConventionCold;
     if (want_cold) {
test/behavior.zig
@@ -13,6 +13,7 @@ comptime {
     _ = @import("cases/bugs/656.zig");
     _ = @import("cases/cast.zig");
     _ = @import("cases/const_slice_child.zig");
+    _ = @import("cases/coroutines.zig");
     _ = @import("cases/defer.zig");
     _ = @import("cases/enum.zig");
     _ = @import("cases/enum_with_members.zig");
@@ -49,15 +50,4 @@ comptime {
     _ = @import("cases/var_args.zig");
     _ = @import("cases/void.zig");
     _ = @import("cases/while.zig");
-
-
-    // LLVM 5.0.1, 6.0.0, and trunk crash when attempting to optimize coroutine code.
-    // So, Zig does not support ReleaseFast or ReleaseSafe for coroutines yet.
-    // Luckily, Clang users are running into the same crashes, so folks from the LLVM
-    // community are working on fixes. If we're really lucky they'll be fixed in 6.0.1.
-    // Otherwise we can hope for 7.0.0.
-    if (builtin.mode == builtin.Mode.Debug) {
-        _ = @import("cases/coroutines.zig");
-    }
-
 }