Prevent miscompilation in trivial loop {}
Ideally, we would want to handle a broader set of cases to fully fix the underlying bug here. That is currently relatively expensive at compile and runtime, so we don't do that for now.
This commit is contained in:
@@ -334,8 +334,8 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
||||
self.call(expect, &[cond, self.const_bool(expected)], None)
|
||||
}
|
||||
|
||||
fn sideeffect(&mut self) {
|
||||
if self.tcx.sess.opts.debugging_opts.insert_sideeffect {
|
||||
fn sideeffect(&mut self, unconditional: bool) {
|
||||
if unconditional || self.tcx.sess.opts.debugging_opts.insert_sideeffect {
|
||||
let fnname = self.get_intrinsic(&("llvm.sideeffect"));
|
||||
self.call(fnname, &[], None);
|
||||
}
|
||||
@@ -390,7 +390,7 @@ fn codegen_msvc_try(
|
||||
) {
|
||||
let llfn = get_rust_try_fn(bx, &mut |mut bx| {
|
||||
bx.set_personality_fn(bx.eh_personality());
|
||||
bx.sideeffect();
|
||||
bx.sideeffect(false);
|
||||
|
||||
let mut normal = bx.build_sibling_block("normal");
|
||||
let mut catchswitch = bx.build_sibling_block("catchswitch");
|
||||
@@ -553,7 +553,7 @@ fn codegen_gnu_try(
|
||||
// call %catch_func(%data, %ptr)
|
||||
// ret 1
|
||||
|
||||
bx.sideeffect();
|
||||
bx.sideeffect(false);
|
||||
|
||||
let mut then = bx.build_sibling_block("then");
|
||||
let mut catch = bx.build_sibling_block("catch");
|
||||
@@ -615,7 +615,7 @@ fn codegen_emcc_try(
|
||||
// call %catch_func(%data, %catch_data)
|
||||
// ret 1
|
||||
|
||||
bx.sideeffect();
|
||||
bx.sideeffect(false);
|
||||
|
||||
let mut then = bx.build_sibling_block("then");
|
||||
let mut catch = bx.build_sibling_block("catch");
|
||||
|
||||
Reference in New Issue
Block a user