aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
authorTohei Ichikawa <ichikawa.tohei.desu@gmail.com>2025-09-24 21:09:31 -0400
committerTohei Ichikawa <ichikawa.tohei.desu@gmail.com>2025-09-24 21:09:31 -0400
commit6ed9351955a8996418a8da10cd7b0da179734095 (patch)
tree1ddd4476a5b9d2af23f3240eaf31e7bfe28df9f1 /src/llvm_backend_expr.cpp
parent3c1238991ba6f68f4ea31ca8ed368387821fa7d7 (diff)
parent5d3092bf2d00a46311a5f785658f04c823a9f3fa (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index cff91813e..4a1f39c19 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -2495,6 +2495,11 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
Type *vt = dst->Union.variants[0];
if (internal_check_is_assignable_to(src_type, vt)) {
value = lb_emit_conv(p, value, vt);
+ if (lb_is_const(value)) {
+ LLVMValueRef res = lb_construct_const_union(m, value.value, vt, t);
+ return {res, t};
+ }
+
lbAddr parent = lb_add_local_generated(p, t, true);
lb_emit_store_union_variant(p, parent.addr, value, vt);
return lb_addr_load(p, parent);
@@ -2503,11 +2508,18 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
for (Type *vt : dst->Union.variants) {
if (src_type == t_llvm_bool && is_type_boolean(vt)) {
value = lb_emit_conv(p, value, vt);
+ if (lb_try_construct_const_union(m, &value, vt, t)) {
+ return value;
+ }
+
lbAddr parent = lb_add_local_generated(p, t, true);
lb_emit_store_union_variant(p, parent.addr, value, vt);
return lb_addr_load(p, parent);
}
if (are_types_identical(src_type, vt)) {
+ if (lb_try_construct_const_union(m, &value, vt, t)) {
+ return value;
+ }
lbAddr parent = lb_add_local_generated(p, t, true);
lb_emit_store_union_variant(p, parent.addr, value, vt);
return lb_addr_load(p, parent);
@@ -2545,6 +2557,9 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
if (valid_count == 1) {
Type *vt = dst->Union.variants[first_success_index];
value = lb_emit_conv(p, value, vt);
+ if (lb_try_construct_const_union(m, &value, vt, t)) {
+ return value;
+ }
lbAddr parent = lb_add_local_generated(p, t, true);
lb_emit_store_union_variant(p, parent.addr, value, vt);
return lb_addr_load(p, parent);