[llvm] Fix an assert.
authorZoltan Varga <vargaz@gmail.com>
Wed, 21 Aug 2019 16:03:16 +0000 (12:03 -0400)
committerZoltan Varga <vargaz@gmail.com>
Wed, 21 Aug 2019 16:03:20 +0000 (12:03 -0400)
Fixes https://github.com/mono/mono/issues/16381.

Commit migrated from https://github.com/mono/mono/commit/0e2da3c2abb0c2797cb24da05e16d76bfc179e8c

src/mono/mono/mini/mini-llvm.c
src/mono/mono/mini/simd-intrinsics-netcore.c

index 0d96eb8..8cea98a 100644 (file)
@@ -7101,11 +7101,11 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                case OP_XCOMPARE_FP: {
                        LLVMRealPredicate pred = fpcond_to_llvm_cond [ins->inst_c0];
                        LLVMValueRef cmp = LLVMBuildFCmp (builder, pred, lhs, rhs, "");
-                       g_assert_not_reached ();
-                       if (LLVMGetVectorSize (LLVMTypeOf (lhs)) == 2)
-                               values [ins->dreg] = LLVMBuildBitCast (builder, LLVMBuildSExt (builder, cmp, LLVMVectorType (LLVMInt64Type (), 2), ""), LLVMTypeOf (lhs), "");
+                       int nelems = LLVMGetVectorSize (LLVMTypeOf (cmp));
+                       if (ins->inst_c1 == MONO_TYPE_R8)
+                               values [ins->dreg] = LLVMBuildBitCast (builder, LLVMBuildSExt (builder, cmp, LLVMVectorType (LLVMInt64Type (), nelems), ""), LLVMTypeOf (lhs), "");
                        else
-                               values [ins->dreg] = LLVMBuildBitCast (builder, LLVMBuildSExt (builder, cmp, LLVMVectorType (LLVMInt32Type (), 4), ""), LLVMTypeOf (lhs), "");
+                               values [ins->dreg] = LLVMBuildBitCast (builder, LLVMBuildSExt (builder, cmp, LLVMVectorType (LLVMInt32Type (), nelems), ""), LLVMTypeOf (lhs), "");
                        break;
                }
                case OP_XCOMPARE: {
index 9bf8a4f..a73bfe2 100644 (file)
@@ -239,6 +239,7 @@ emit_xcompare (MonoCompile *cfg, MonoClass *klass, MonoType *etype, MonoInst *ar
 
        ins = emit_simd_ins (cfg, klass, is_fp ? OP_XCOMPARE_FP : OP_XCOMPARE, arg1->dreg, arg2->dreg);
        ins->inst_c0 = CMP_EQ;
+       ins->inst_c1 = etype->type;
        return ins;
 }