mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Remove workaround for the forward progress handling in LLVM
This commit is contained in:
parent
f820d9d4e5
commit
50ec47aa06
@ -316,7 +316,7 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
|
||||
extended_asm.add_input_operand(None, "r", result.llval);
|
||||
extended_asm.add_clobber("memory");
|
||||
extended_asm.set_volatile_flag(true);
|
||||
|
||||
|
||||
// We have copied the value to `result` already.
|
||||
return;
|
||||
}
|
||||
@ -363,10 +363,6 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
|
||||
cond
|
||||
}
|
||||
|
||||
fn sideeffect(&mut self) {
|
||||
// TODO(antoyo)
|
||||
}
|
||||
|
||||
fn type_test(&mut self, _pointer: Self::Value, _typeid: Self::Value) -> Self::Value {
|
||||
// Unsupported.
|
||||
self.context.new_rvalue_from_int(self.int_type, 0)
|
||||
|
@ -597,7 +597,6 @@ impl CodegenCx<'b, 'tcx> {
|
||||
ifn!("llvm.trap", fn() -> void);
|
||||
ifn!("llvm.debugtrap", fn() -> void);
|
||||
ifn!("llvm.frameaddress", fn(t_i32) -> i8p);
|
||||
ifn!("llvm.sideeffect", fn() -> void);
|
||||
|
||||
ifn!("llvm.powi.f32", fn(t_f32, t_i32) -> t_f32);
|
||||
ifn!("llvm.powi.f64", fn(t_f64, t_i32) -> t_f64);
|
||||
|
@ -392,15 +392,6 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
||||
self.call_intrinsic("llvm.expect.i1", &[cond, self.const_bool(expected)])
|
||||
}
|
||||
|
||||
fn sideeffect(&mut self) {
|
||||
// This kind of check would make a ton of sense in the caller, but currently the only
|
||||
// caller of this function is in `rustc_codegen_ssa`, which is agnostic to whether LLVM
|
||||
// codegen backend being used, and so is unable to check the LLVM version.
|
||||
if unsafe { llvm::LLVMRustVersionMajor() } < 12 {
|
||||
self.call_intrinsic("llvm.sideeffect", &[]);
|
||||
}
|
||||
}
|
||||
|
||||
fn type_test(&mut self, pointer: Self::Value, typeid: Self::Value) -> Self::Value {
|
||||
// Test the called operand using llvm.type.test intrinsic. The LowerTypeTests link-time
|
||||
// optimization pass replaces calls to this intrinsic with code to test type membership.
|
||||
|
@ -980,17 +980,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||
}
|
||||
|
||||
mir::TerminatorKind::Goto { target } => {
|
||||
if bb == target {
|
||||
// This is an unconditional branch back to this same basic block. That means we
|
||||
// have something like a `loop {}` statement. LLVM versions before 12.0
|
||||
// miscompile this because they assume forward progress. For older versions
|
||||
// try to handle just this specific case which comes up commonly in practice
|
||||
// (e.g., in embedded code).
|
||||
//
|
||||
// NB: the `sideeffect` currently checks for the LLVM version used internally.
|
||||
bx.sideeffect();
|
||||
}
|
||||
|
||||
helper.funclet_br(self, &mut bx, target);
|
||||
}
|
||||
|
||||
|
@ -20,10 +20,6 @@ pub trait IntrinsicCallMethods<'tcx>: BackendTypes {
|
||||
fn abort(&mut self);
|
||||
fn assume(&mut self, val: Self::Value);
|
||||
fn expect(&mut self, cond: Self::Value, expected: bool) -> Self::Value;
|
||||
/// Emits a forced side effect.
|
||||
///
|
||||
/// Currently has any effect only when LLVM versions prior to 12.0 are used as the backend.
|
||||
fn sideeffect(&mut self);
|
||||
/// Trait method used to test whether a given pointer is associated with a type identifier.
|
||||
fn type_test(&mut self, pointer: Self::Value, typeid: Self::Value) -> Self::Value;
|
||||
/// Trait method used to inject `va_start` on the "spoofed" `VaListImpl` in
|
||||
|
Loading…
Reference in New Issue
Block a user