[mono][llvm] Fix an assertion when a method doesn't set its return value vreg. (...
authorZoltan Varga <vargaz@gmail.com>
Thu, 10 Aug 2023 17:29:46 +0000 (13:29 -0400)
committerGitHub <noreply@github.com>
Thu, 10 Aug 2023 17:29:46 +0000 (12:29 -0500)
Fixes https://github.com/dotnet/runtime/issues/90032.

src/mono/mono/mini/mini-llvm.c

index 13388e8..a6c23aa 100644 (file)
@@ -6037,16 +6037,16 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                                gboolean is_simd = mini_class_is_simd (ctx->cfg, mono_class_from_mono_type_internal (sig->ret));
 
                                if (is_simd) {
-                                       g_assert (lhs);
                                        retval = LLVMConstNull(ret_type);
 
-                                       int len = LLVMGetVectorSize (LLVMTypeOf (lhs));
-                                       for (int i = 0; i < len; i++)
-                                       {
-                                               elem = LLVMBuildExtractElement (builder, lhs, const_int32 (i), "extract_elem");
-                                               retval = LLVMBuildInsertValue (builder, retval, elem, i, "insert_val_struct");
+                                       if (lhs) {
+                                               int len = LLVMGetVectorSize (LLVMTypeOf (lhs));
+                                               for (int i = 0; i < len; i++) {
+                                                       elem = LLVMBuildExtractElement (builder, lhs, const_int32 (i), "extract_elem");
+                                                       retval = LLVMBuildInsertValue (builder, retval, elem, i, "insert_val_struct");
+                                               }
                                        }
-                               } else{
+                               } else {
                                        g_assert (addresses [ins->sreg1]);
                                        retval = LLVMBuildLoad2 (builder, ret_type, convert (ctx, addresses [ins->sreg1]->value, pointer_type (ret_type)), "");
                                }