Revert "llvm coroutine workaround: sret functions return sret pointer"
This reverts commit 132e604aa3
.
this workaround didn't work either
master
parent
138d6f9093
commit
d243453862
|
@ -1026,10 +1026,7 @@ TypeTableEntry *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) {
|
||||||
gen_param_index += 1;
|
gen_param_index += 1;
|
||||||
// after the gen_param_index += 1 because 0 is the return type
|
// after the gen_param_index += 1 because 0 is the return type
|
||||||
param_di_types[gen_param_index] = gen_type->di_type;
|
param_di_types[gen_param_index] = gen_type->di_type;
|
||||||
|
gen_return_type = g->builtin_types.entry_void;
|
||||||
// as a workaround for LLVM coroutines not understanding instruction dependencies,
|
|
||||||
// we return the sret pointer argument instead of returning void
|
|
||||||
gen_return_type = gen_type;
|
|
||||||
} else {
|
} else {
|
||||||
gen_return_type = fn_type_id->return_type;
|
gen_return_type = fn_type_id->return_type;
|
||||||
}
|
}
|
||||||
|
|
|
@ -547,10 +547,7 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
|
||||||
} else if (handle_is_ptr(return_type) &&
|
} else if (handle_is_ptr(return_type) &&
|
||||||
calling_convention_does_first_arg_return(fn_type->data.fn.fn_type_id.cc))
|
calling_convention_does_first_arg_return(fn_type->data.fn.fn_type_id.cc))
|
||||||
{
|
{
|
||||||
// We do not add the sret attribute, because it would require the return type to be void,
|
addLLVMArgAttr(fn_table_entry->llvm_value, 0, "sret");
|
||||||
// and we want the return value to return the sret pointer, to work around LLVM Coroutine
|
|
||||||
// transformation passes not understanding the data dependency.
|
|
||||||
//addLLVMArgAttr(fn_table_entry->llvm_value, 0, "sret");
|
|
||||||
addLLVMArgAttr(fn_table_entry->llvm_value, 0, "nonnull");
|
addLLVMArgAttr(fn_table_entry->llvm_value, 0, "nonnull");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1619,9 +1616,7 @@ static LLVMValueRef ir_render_return(CodeGen *g, IrExecutable *executable, IrIns
|
||||||
if (calling_convention_does_first_arg_return(g->cur_fn->type_entry->data.fn.fn_type_id.cc)) {
|
if (calling_convention_does_first_arg_return(g->cur_fn->type_entry->data.fn.fn_type_id.cc)) {
|
||||||
assert(g->cur_ret_ptr);
|
assert(g->cur_ret_ptr);
|
||||||
gen_assign_raw(g, g->cur_ret_ptr, get_pointer_to_type(g, return_type, false), value);
|
gen_assign_raw(g, g->cur_ret_ptr, get_pointer_to_type(g, return_type, false), value);
|
||||||
// as a workaround for LLVM coroutines not understanding instruction dependencies,
|
LLVMBuildRetVoid(g->builder);
|
||||||
// we return the sret pointer argument instead of returning void
|
|
||||||
LLVMBuildRet(g->builder, g->cur_ret_ptr);
|
|
||||||
} else {
|
} else {
|
||||||
LLVMValueRef by_val_value = gen_load_untyped(g, value, 0, false, "");
|
LLVMValueRef by_val_value = gen_load_untyped(g, value, 0, false, "");
|
||||||
LLVMBuildRet(g->builder, by_val_value);
|
LLVMBuildRet(g->builder, by_val_value);
|
||||||
|
@ -2774,9 +2769,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr
|
||||||
} else if (!ret_has_bits) {
|
} else if (!ret_has_bits) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
} else if (first_arg_ret) {
|
} else if (first_arg_ret) {
|
||||||
// instead of returning instruction->tmp_ptr here, we trust that the function returned the first arg.
|
return instruction->tmp_ptr;
|
||||||
// this is a workaround for llvm coroutines not understanding the data dependency
|
|
||||||
return result;
|
|
||||||
} else {
|
} else {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue