Remove array->vector casts

This commit is contained in:
Christoffer Lerno
2025-01-03 01:35:51 +01:00
parent d027a15b4a
commit 56d25cdeeb
13 changed files with 56 additions and 50 deletions

View File

@@ -400,6 +400,7 @@ static void c_emit_expr(GenContext *c, CValue *value, Expr *expr)
case EXPR_EXT_TRUNC: case EXPR_EXT_TRUNC:
case EXPR_MAKE_ANY: case EXPR_MAKE_ANY:
case EXPR_INT_TO_BOOL: case EXPR_INT_TO_BOOL:
case EXPR_VECTOR_FROM_ARRAY:
break; break;
case EXPR_ACCESS: case EXPR_ACCESS:
break; break;

View File

@@ -3368,6 +3368,8 @@ static inline void expr_set_span(Expr *expr, SourceSpan loc)
expr_set_span(expr->make_any_expr.typeid, loc); expr_set_span(expr->make_any_expr.typeid, loc);
return; return;
case EXPR_SPLAT: case EXPR_SPLAT:
case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
expr_set_span(expr->inner_expr, loc); expr_set_span(expr->inner_expr, loc);
return; return;
case EXPR_EXPRESSION_LIST: case EXPR_EXPRESSION_LIST:
@@ -3437,7 +3439,6 @@ static inline void expr_set_span(Expr *expr, SourceSpan loc)
case EXPR_DEFAULT_ARG: case EXPR_DEFAULT_ARG:
case EXPR_TYPECALL: case EXPR_TYPECALL:
case EXPR_MEMBER_GET: case EXPR_MEMBER_GET:
case EXPR_PTR_ACCESS:
case EXPR_RVALUE: case EXPR_RVALUE:
break; break;
} }

View File

@@ -476,6 +476,7 @@ Expr *copy_expr(CopyStruct *c, Expr *source_expr)
case EXPR_SPLAT: case EXPR_SPLAT:
case EXPR_STRINGIFY: case EXPR_STRINGIFY:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_RVALUE: case EXPR_RVALUE:
MACRO_COPY_EXPR(expr->inner_expr); MACRO_COPY_EXPR(expr->inner_expr);
return expr; return expr;

View File

@@ -538,7 +538,6 @@ typedef enum
typedef enum typedef enum
{ {
CAST_APTSA, CAST_APTSA,
CAST_ARRVEC,
CAST_BOOLBOOL, CAST_BOOLBOOL,
CAST_BOOLFP, CAST_BOOLFP,
CAST_BSINTARR, CAST_BSINTARR,
@@ -558,7 +557,6 @@ typedef enum
CAST_PTRBOOL, CAST_PTRBOOL,
CAST_PTRINT, CAST_PTRINT,
CAST_SLBOOL, CAST_SLBOOL,
CAST_SLSL,
CAST_SLARR, CAST_SLARR,
CAST_STINLINE, CAST_STINLINE,
CAST_VECARR, CAST_VECARR,
@@ -816,6 +814,7 @@ typedef enum
EXPR_TYPEINFO, EXPR_TYPEINFO,
EXPR_UNARY, EXPR_UNARY,
EXPR_VASPLAT, EXPR_VASPLAT,
EXPR_VECTOR_FROM_ARRAY,
EXPR_EXT_TRUNC, EXPR_EXT_TRUNC,
EXPR_INT_TO_BOOL, EXPR_INT_TO_BOOL,
EXPR_LAST = EXPR_VASPLAT EXPR_LAST = EXPR_VASPLAT

View File

@@ -82,6 +82,7 @@ bool expr_may_addr(Expr *expr)
return true; return true;
case EXPR_BENCHMARK_HOOK: case EXPR_BENCHMARK_HOOK:
case EXPR_TEST_HOOK: case EXPR_TEST_HOOK:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_RVALUE: case EXPR_RVALUE:
return false; return false;
@@ -191,6 +192,7 @@ bool expr_is_runtime_const(Expr *expr)
case EXPR_COND: case EXPR_COND:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
return false; return false;
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_RVALUE: case EXPR_RVALUE:
return expr_is_runtime_const(expr->inner_expr); return expr_is_runtime_const(expr->inner_expr);
case EXPR_MAKE_ANY: case EXPR_MAKE_ANY:
@@ -361,11 +363,9 @@ static inline bool expr_cast_is_runtime_const(Expr *expr)
case CAST_SLBOOL: case CAST_SLBOOL:
case CAST_STINLINE: case CAST_STINLINE:
case CAST_VECARR: case CAST_VECARR:
case CAST_ARRVEC:
return exprid_is_runtime_const(expr->cast_expr.expr); return exprid_is_runtime_const(expr->cast_expr.expr);
case CAST_INTPTR: case CAST_INTPTR:
case CAST_APTSA: case CAST_APTSA:
case CAST_SLSL:
case CAST_VOID: case CAST_VOID:
case CAST_ERPTR: case CAST_ERPTR:
case CAST_IDPTR: case CAST_IDPTR:
@@ -610,6 +610,7 @@ bool expr_is_pure(Expr *expr)
case EXPR_MAKE_ANY: case EXPR_MAKE_ANY:
return expr_is_pure(expr->make_any_expr.inner) && expr_is_pure(expr->make_any_expr.typeid); return expr_is_pure(expr->make_any_expr.inner) && expr_is_pure(expr->make_any_expr.typeid);
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_RVALUE: case EXPR_RVALUE:
return expr_is_pure(expr->inner_expr); return expr_is_pure(expr->inner_expr);
case EXPR_INT_TO_BOOL: case EXPR_INT_TO_BOOL:

View File

@@ -258,6 +258,8 @@ void print_var_expr(FILE *file, Expr *expr)
print_var_expr(file, expr->access_expr.parent); print_var_expr(file, expr->access_expr.parent);
fputs(")", file); fputs(")", file);
break; break;
case EXPR_VECTOR_FROM_ARRAY:
TODO
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
print_var_expr(file, expr->access_expr.parent); print_var_expr(file, expr->access_expr.parent);
fputs(".ptr", file); fputs(".ptr", file);

View File

@@ -1279,17 +1279,6 @@ void llvm_emit_vector_to_array_cast(GenContext *c, BEValue *value, Type *to_type
llvm_value_set(value, array, to_type); llvm_value_set(value, array, to_type);
} }
void llvm_emit_array_to_vector_cast(GenContext *c, BEValue *value, Type *to_type, Type *from_type)
{
llvm_value_rvalue(c, value);
LLVMValueRef vector = llvm_get_undef(c, to_type);
for (unsigned i = 0; i < to_type->array.len; i++)
{
LLVMValueRef element = llvm_emit_extract_value(c, value->value, i);
vector = llvm_emit_insert_value(c, vector, element, i);
}
llvm_value_set(value, vector, to_type);
}
void llvm_emit_slice_to_vec_array_cast(GenContext *c, BEValue *value, Type *to_type, Type *from_type) void llvm_emit_slice_to_vec_array_cast(GenContext *c, BEValue *value, Type *to_type, Type *from_type)
@@ -1449,9 +1438,6 @@ void llvm_emit_cast(GenContext *c, CastKind cast_kind, Expr *expr, BEValue *valu
case CAST_EXPVEC: case CAST_EXPVEC:
llvm_emit_expand_to_vec_cast(c, value, to_type, from_type); llvm_emit_expand_to_vec_cast(c, value, to_type, from_type);
return; return;
case CAST_ARRVEC:
llvm_emit_array_to_vector_cast(c, value, to_type, from_type);
return;
case CAST_VOID: case CAST_VOID:
UNREACHABLE; UNREACHABLE;
case CAST_ERROR: case CAST_ERROR:
@@ -1530,9 +1516,6 @@ void llvm_emit_cast(GenContext *c, CastKind cast_kind, Expr *expr, BEValue *valu
llvm_value_rvalue(c, value); llvm_value_rvalue(c, value);
value->value = LLVMBuildIntToPtr(c->builder, value->value, llvm_get_type(c, to_type), "intptr"); value->value = LLVMBuildIntToPtr(c->builder, value->value, llvm_get_type(c, to_type), "intptr");
break; break;
case CAST_SLSL:
// Improve this
break;
case CAST_STINLINE: case CAST_STINLINE:
llvm_value_addr(c, value); llvm_value_addr(c, value);
value->type = to_type; value->type = to_type;
@@ -7270,6 +7253,28 @@ static void llvm_emit_int_to_bool(GenContext *c, BEValue *value, Expr *expr)
expr->type); expr->type);
} }
static void llvm_emit_vector_from_array(GenContext *c, BEValue *value, Expr *expr)
{
Expr *inner = expr->inner_expr;
llvm_emit_expr(c, value, inner);
llvm_value_fold_optional(c, value);
Type *to_type = type_lowering(expr->type);
if (llvm_value_is_addr(value))
{
// Unaligned load
value->type = to_type;
llvm_value_rvalue(c, value);
return;
}
LLVMValueRef vector = llvm_get_undef(c, to_type);
for (unsigned i = 0; i < to_type->array.len; i++)
{
LLVMValueRef element = llvm_emit_extract_value(c, value->value, i);
vector = llvm_emit_insert_value(c, vector, element, i);
}
llvm_value_set(value, vector, to_type);
}
static void llvm_emit_ptr_access(GenContext *c, BEValue *value, Expr *expr) static void llvm_emit_ptr_access(GenContext *c, BEValue *value, Expr *expr)
{ {
llvm_emit_expr(c, value, expr->inner_expr); llvm_emit_expr(c, value, expr->inner_expr);
@@ -7334,6 +7339,9 @@ void llvm_emit_expr(GenContext *c, BEValue *value, Expr *expr)
llvm_value_rvalue(c, value); llvm_value_rvalue(c, value);
value->type = type_lowering(expr->type); value->type = type_lowering(expr->type);
return; return;
case EXPR_VECTOR_FROM_ARRAY:
llvm_emit_vector_from_array(c, value, expr);
return;
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
llvm_emit_ptr_access(c, value, expr); llvm_emit_ptr_access(c, value, expr);
return; return;

View File

@@ -1989,7 +1989,7 @@ static void cast_slice_to_slice(SemaContext *context, Expr *expr, Type *to_type)
expr->type = to_type; expr->type = to_type;
return; return;
} }
insert_runtime_cast(expr, CAST_SLSL, to_type); expr_rewrite_rvalue(expr, to_type);
} }
static void cast_vecarr_to_slice(SemaContext *context, Expr *expr, Type *to_type) static void cast_vecarr_to_slice(SemaContext *context, Expr *expr, Type *to_type)
@@ -2100,7 +2100,10 @@ static void cast_arr_to_vec(SemaContext *context, Expr *expr, Type *to_type)
} }
else else
{ {
insert_runtime_cast(expr, CAST_ARRVEC, to_temp); Expr *inner = expr_copy(expr);
expr->expr_kind = EXPR_VECTOR_FROM_ARRAY;
expr->inner_expr = inner;
expr->type = to_temp;
} }
if (to_temp != to_type) if (to_temp != to_type)
{ {

View File

@@ -571,6 +571,7 @@ static bool sema_binary_is_expr_lvalue(SemaContext *context, Expr *top_expr, Exp
case EXPR_MEMBER_GET: case EXPR_MEMBER_GET:
case EXPR_NAMED_ARGUMENT: case EXPR_NAMED_ARGUMENT:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_RVALUE: case EXPR_RVALUE:
case EXPR_MAKE_ANY: case EXPR_MAKE_ANY:
goto ERR; goto ERR;
@@ -601,6 +602,7 @@ static bool expr_may_ref(Expr *expr)
case EXPR_MEMBER_GET: case EXPR_MEMBER_GET:
case EXPR_EXT_TRUNC: case EXPR_EXT_TRUNC:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_INT_TO_BOOL: case EXPR_INT_TO_BOOL:
case EXPR_RVALUE: case EXPR_RVALUE:
return false; return false;
@@ -8969,6 +8971,7 @@ static inline bool sema_expr_analyse_ct_defined(SemaContext *context, Expr *expr
case EXPR_EXT_TRUNC: case EXPR_EXT_TRUNC:
case EXPR_INT_TO_BOOL: case EXPR_INT_TO_BOOL:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_RVALUE: case EXPR_RVALUE:
case EXPR_MAKE_ANY: case EXPR_MAKE_ANY:
if (!sema_analyse_expr(active_context, main_expr)) goto FAIL; if (!sema_analyse_expr(active_context, main_expr)) goto FAIL;
@@ -9359,6 +9362,7 @@ static inline bool sema_analyse_expr_dispatch(SemaContext *context, Expr *expr,
case EXPR_RVALUE: case EXPR_RVALUE:
return sema_analyse_expr(context, expr->inner_expr); return sema_analyse_expr(context, expr->inner_expr);
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
return sema_analyse_expr(context, expr->inner_expr); return sema_analyse_expr(context, expr->inner_expr);
case EXPR_INT_TO_BOOL: case EXPR_INT_TO_BOOL:
return sema_analyse_expr(context, expr->int_to_bool_expr.inner); return sema_analyse_expr(context, expr->int_to_bool_expr.inner);

View File

@@ -330,6 +330,7 @@ RETRY:
case EXPR_RETHROW: case EXPR_RETHROW:
case EXPR_OPTIONAL: case EXPR_OPTIONAL:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_RVALUE: case EXPR_RVALUE:
expr = expr->inner_expr; expr = expr->inner_expr;
goto RETRY; goto RETRY;

View File

@@ -763,6 +763,7 @@ static inline bool sema_expr_valid_try_expression(Expr *expr)
case EXPR_EXT_TRUNC: case EXPR_EXT_TRUNC:
case EXPR_INT_TO_BOOL: case EXPR_INT_TO_BOOL:
case EXPR_PTR_ACCESS: case EXPR_PTR_ACCESS:
case EXPR_VECTOR_FROM_ARRAY:
case EXPR_RVALUE: case EXPR_RVALUE:
return true; return true;
} }

View File

@@ -25,21 +25,13 @@ entry:
%0 = insertvalue %"float[]" undef, ptr %ptradd, 0 %0 = insertvalue %"float[]" undef, ptr %ptradd, 0
%1 = insertvalue %"float[]" %0, i64 4, 1 %1 = insertvalue %"float[]" %0, i64 4, 1
%2 = extractvalue %"float[]" %1, 0 %2 = extractvalue %"float[]" %1, 0
%3 = load [4 x float], ptr %2, align 4 %3 = load <4 x float>, ptr %2, align 4
%4 = extractvalue [4 x float] %3, 0 store <4 x float> %3, ptr %x, align 16
%5 = insertelement <4 x float> undef, float %4, i64 0
%6 = extractvalue [4 x float] %3, 1
%7 = insertelement <4 x float> %5, float %6, i64 1
%8 = extractvalue [4 x float] %3, 2
%9 = insertelement <4 x float> %7, float %8, i64 2
%10 = extractvalue [4 x float] %3, 3
%11 = insertelement <4 x float> %9, float %10, i64 3
store <4 x float> %11, ptr %x, align 16
call void @foo.get(ptr sret([20 x float]) align 4 %sretparam1) call void @foo.get(ptr sret([20 x float]) align 4 %sretparam1)
%ptradd2 = getelementptr inbounds i8, ptr %sretparam1, i64 8 %ptradd2 = getelementptr inbounds i8, ptr %sretparam1, i64 8
%12 = insertvalue %"float[]" undef, ptr %ptradd2, 0 %4 = insertvalue %"float[]" undef, ptr %ptradd2, 0
%13 = insertvalue %"float[]" %12, i64 4, 1 %5 = insertvalue %"float[]" %4, i64 4, 1
%14 = extractvalue %"float[]" %13, 0 %6 = extractvalue %"float[]" %5, 0
call void @llvm.memcpy.p0.p0.i32(ptr align 16 %y, ptr align 4 %14, i32 16, i1 false) call void @llvm.memcpy.p0.p0.i32(ptr align 16 %y, ptr align 4 %6, i32 16, i1 false)
ret void ret void
} }

View File

@@ -30,18 +30,10 @@ entry:
%3 = extractelement <2 x i32> %0, i64 1 %3 = extractelement <2 x i32> %0, i64 1
%4 = insertvalue [2 x i32] %2, i32 %3, 1 %4 = insertvalue [2 x i32] %2, i32 %3, 1
store [2 x i32] %4, ptr %y, align 4 store [2 x i32] %4, ptr %y, align 4
%5 = load [2 x i32], ptr %y, align 4 %5 = load <2 x i32>, ptr %y, align 4
%6 = extractvalue [2 x i32] %5, 0 %sifp = sitofp <2 x i32> %5 to <2 x double>
%7 = insertelement <2 x i32> undef, i32 %6, i64 0
%8 = extractvalue [2 x i32] %5, 1
%9 = insertelement <2 x i32> %7, i32 %8, i64 1
%sifp = sitofp <2 x i32> %9 to <2 x double>
store <2 x double> %sifp, ptr %zz, align 16 store <2 x double> %sifp, ptr %zz, align 16
%10 = load [2 x i32], ptr %y, align 4 %6 = load <2 x i32>, ptr %y, align 4
%11 = extractvalue [2 x i32] %10, 0 store <2 x i32> %6, ptr %x, align 8
%12 = insertelement <2 x i32> undef, i32 %11, i64 0
%13 = extractvalue [2 x i32] %10, 1
%14 = insertelement <2 x i32> %12, i32 %13, i64 1
store <2 x i32> %14, ptr %x, align 8
ret void ret void
} }