Fix crash after simd type validation error

Fixes part of #1319
This commit is contained in:
bjorn3 2022-12-16 14:15:59 +00:00
parent 1c724ee6d0
commit dffa6acf73
2 changed files with 9 additions and 6 deletions

View File

@ -240,10 +240,9 @@ pub(crate) fn codegen_intrinsic_call<'tcx>(
substs, substs,
args, args,
destination, destination,
target,
source_info.span, source_info.span,
); );
let ret_block = fx.get_block(target);
fx.bcx.ins().jump(ret_block, &[]);
} else if codegen_float_intrinsic_call(fx, intrinsic, args, destination) { } else if codegen_float_intrinsic_call(fx, intrinsic, args, destination) {
let ret_block = fx.get_block(target); let ret_block = fx.get_block(target);
fx.bcx.ins().jump(ret_block, &[]); fx.bcx.ins().jump(ret_block, &[]);

View File

@ -24,6 +24,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
_substs: SubstsRef<'tcx>, _substs: SubstsRef<'tcx>,
args: &[mir::Operand<'tcx>], args: &[mir::Operand<'tcx>],
ret: CPlace<'tcx>, ret: CPlace<'tcx>,
target: BasicBlock,
span: Span, span: Span,
) { ) {
match intrinsic { match intrinsic {
@ -277,16 +278,15 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
} else { } else {
fx.tcx.sess.span_warn(span, "Index argument for `simd_extract` is not a constant"); fx.tcx.sess.span_warn(span, "Index argument for `simd_extract` is not a constant");
let trap_block = fx.bcx.create_block(); let trap_block = fx.bcx.create_block();
let dummy_block = fx.bcx.create_block();
let true_ = fx.bcx.ins().iconst(types::I8, 1); let true_ = fx.bcx.ins().iconst(types::I8, 1);
fx.bcx.ins().brnz(true_, trap_block, &[]); fx.bcx.ins().brnz(true_, trap_block, &[]);
fx.bcx.ins().jump(dummy_block, &[]); let ret_block = fx.get_block(target);
fx.bcx.ins().jump(ret_block, &[]);
fx.bcx.switch_to_block(trap_block); fx.bcx.switch_to_block(trap_block);
crate::trap::trap_unimplemented( crate::trap::trap_unimplemented(
fx, fx,
"Index argument for `simd_extract` is not a constant", "Index argument for `simd_extract` is not a constant",
); );
fx.bcx.switch_to_block(dummy_block);
return; return;
}; };
@ -876,7 +876,11 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
} }
_ => { _ => {
fx.tcx.sess.span_fatal(span, &format!("Unknown SIMD intrinsic {}", intrinsic)); fx.tcx.sess.span_err(span, &format!("Unknown SIMD intrinsic {}", intrinsic));
// Prevent verifier error
fx.bcx.ins().trap(TrapCode::UnreachableCodeReached);
} }
} }
let ret_block = fx.get_block(target);
fx.bcx.ins().jump(ret_block, &[]);
} }