Auto merge of #104935 - matthiaskrgr:rollup-nuca86l, r=matthiaskrgr

Rollup of 6 pull requests

Successful merges:

 - #104121 (Refine `instruction_set` MIR inline rules)
 - #104675 (Unsupported query error now specifies if its unsupported for local or external crate)
 - #104839 (improve array_from_fn documenation)
 - #104880 ([llvm-wrapper] adapt for LLVM API change)
 - #104899 (rustdoc: remove no-op CSS `#help dt { display: block }`)
 - #104906 (Remove AscribeUserTypeCx)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2022-11-26 12:11:32 +00:00
commit 579c993b35
10 changed files with 149 additions and 141 deletions

View File

@ -627,7 +627,11 @@ LLVMRustOptimize(
bool DebugPassManager = false; bool DebugPassManager = false;
PassInstrumentationCallbacks PIC; PassInstrumentationCallbacks PIC;
#if LLVM_VERSION_LT(16, 0)
StandardInstrumentations SI(DebugPassManager); StandardInstrumentations SI(DebugPassManager);
#else
StandardInstrumentations SI(TheModule->getContext(), DebugPassManager);
#endif
SI.registerCallbacks(PIC); SI.registerCallbacks(PIC);
if (LlvmSelfProfiler){ if (LlvmSelfProfiler){

View File

@ -276,13 +276,16 @@ pub struct ExternProviders {
impl Default for Providers { impl Default for Providers {
fn default() -> Self { fn default() -> Self {
use crate::query::Key;
Providers { Providers {
$($name: |_, key| bug!( $($name: |_, key| bug!(
"`tcx.{}({:?})` is not supported for external or local crate;\n "`tcx.{}({:?})` is not supported for {} crate;\n
hint: Queries can be either made to the local crate, or the external crate. This error means you tried to use it for one that's not supported (likely the local crate).\n hint: Queries can be either made to the local crate, or the external crate. This error means you tried to use it for one that's not supported.\n
If that's not the case, {} was likely never assigned to a provider function.\n", If that's not the case, {} was likely never assigned to a provider function.\n",
stringify!($name), stringify!($name),
key, key,
if key.query_crate_is_local() { "local" } else { "external" },
stringify!($name), stringify!($name),
),)* ),)*
} }

View File

@ -375,7 +375,12 @@ fn check_codegen_attributes(
return Err("incompatible sanitizer set"); return Err("incompatible sanitizer set");
} }
if callee_attrs.instruction_set != self.codegen_fn_attrs.instruction_set { // Two functions are compatible if the callee has no attribute (meaning
// that it's codegen agnostic), or sets an attribute that is identical
// to this function's attribute.
if callee_attrs.instruction_set.is_some()
&& callee_attrs.instruction_set != self.codegen_fn_attrs.instruction_set
{
return Err("incompatible instruction set"); return Err("incompatible instruction set");
} }
@ -453,6 +458,15 @@ fn check_mir_body(
if ty.needs_drop(tcx, self.param_env) && let Some(unwind) = unwind { if ty.needs_drop(tcx, self.param_env) && let Some(unwind) = unwind {
work_list.push(unwind); work_list.push(unwind);
} }
} else if callee_attrs.instruction_set != self.codegen_fn_attrs.instruction_set
&& matches!(term.kind, TerminatorKind::InlineAsm { .. })
{
// During the attribute checking stage we allow a callee with no
// instruction_set assigned to count as compatible with a function that does
// assign one. However, during this stage we require an exact match when any
// inline-asm is detected. LLVM will still possibly do an inline later on
// if the no-attribute function ends up with the same instruction set anyway.
return Err("Cannot move inline-asm across instruction sets");
} else { } else {
work_list.extend(term.successors()) work_list.extend(term.successors())
} }

View File

@ -20,6 +20,7 @@
use rustc_data_structures::sync::AtomicU64; use rustc_data_structures::sync::AtomicU64;
use rustc_middle::arena::Arena; use rustc_middle::arena::Arena;
use rustc_middle::dep_graph::{self, DepKindStruct}; use rustc_middle::dep_graph::{self, DepKindStruct};
use rustc_middle::query::Key;
use rustc_middle::ty::query::{query_keys, query_storage, query_stored, query_values}; use rustc_middle::ty::query::{query_keys, query_storage, query_stored, query_values};
use rustc_middle::ty::query::{ExternProviders, Providers, QueryEngine}; use rustc_middle::ty::query::{ExternProviders, Providers, QueryEngine};
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
@ -32,8 +33,6 @@
#[cfg(parallel_compiler)] #[cfg(parallel_compiler)]
pub use rustc_query_system::query::{deadlock, QueryContext}; pub use rustc_query_system::query::{deadlock, QueryContext};
use rustc_middle::query::Key;
pub use rustc_query_system::query::QueryConfig; pub use rustc_query_system::query::QueryConfig;
pub(crate) use rustc_query_system::query::QueryVTable; pub(crate) use rustc_query_system::query::QueryVTable;

View File

@ -1,6 +1,4 @@
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::DefId;
use rustc_infer::infer::at::ToTrace;
use rustc_infer::infer::canonical::{Canonical, QueryResponse}; use rustc_infer::infer::canonical::{Canonical, QueryResponse};
use rustc_infer::infer::{DefiningAnchor, TyCtxtInferExt}; use rustc_infer::infer::{DefiningAnchor, TyCtxtInferExt};
use rustc_infer::traits::ObligationCauseCode; use rustc_infer::traits::ObligationCauseCode;
@ -57,67 +55,17 @@ pub fn type_op_ascribe_user_type_with_span<'tcx>(
"type_op_ascribe_user_type: mir_ty={:?} def_id={:?} user_substs={:?}", "type_op_ascribe_user_type: mir_ty={:?} def_id={:?} user_substs={:?}",
mir_ty, def_id, user_substs mir_ty, def_id, user_substs
); );
let cx = AscribeUserTypeCx { ocx, param_env, span: span.unwrap_or(DUMMY_SP) }; let span = span.unwrap_or(DUMMY_SP);
cx.relate_mir_and_user_ty(mir_ty, def_id, user_substs)?;
Ok(())
}
struct AscribeUserTypeCx<'me, 'tcx> {
ocx: &'me ObligationCtxt<'me, 'tcx>,
param_env: ty::ParamEnv<'tcx>,
span: Span,
}
impl<'me, 'tcx> AscribeUserTypeCx<'me, 'tcx> {
fn normalize<T>(&self, value: T) -> T
where
T: TypeFoldable<'tcx>,
{
self.normalize_with_cause(value, ObligationCause::misc(self.span, hir::CRATE_HIR_ID))
}
fn normalize_with_cause<T>(&self, value: T, cause: ObligationCause<'tcx>) -> T
where
T: TypeFoldable<'tcx>,
{
self.ocx.normalize(cause, self.param_env, value)
}
fn eq<T>(&self, a: T, b: T) -> Result<(), NoSolution>
where
T: ToTrace<'tcx>,
{
Ok(self.ocx.eq(&ObligationCause::dummy_with_span(self.span), self.param_env, a, b)?)
}
fn prove_predicate(&self, predicate: Predicate<'tcx>, cause: ObligationCause<'tcx>) {
self.ocx.register_obligation(Obligation::new(
self.ocx.infcx.tcx,
cause,
self.param_env,
predicate,
));
}
fn tcx(&self) -> TyCtxt<'tcx> {
self.ocx.infcx.tcx
}
#[instrument(level = "debug", skip(self))]
fn relate_mir_and_user_ty(
&self,
mir_ty: Ty<'tcx>,
def_id: DefId,
user_substs: UserSubsts<'tcx>,
) -> Result<(), NoSolution> {
let UserSubsts { user_self_ty, substs } = user_substs; let UserSubsts { user_self_ty, substs } = user_substs;
let tcx = self.tcx(); let tcx = ocx.infcx.tcx;
let cause = ObligationCause::dummy_with_span(span);
let ty = tcx.bound_type_of(def_id).subst(tcx, substs); let ty = tcx.bound_type_of(def_id).subst(tcx, substs);
let ty = self.normalize(ty); let ty = ocx.normalize(cause.clone(), param_env, ty);
debug!("relate_type_and_user_type: ty of def-id is {:?}", ty); debug!("relate_type_and_user_type: ty of def-id is {:?}", ty);
self.eq(mir_ty, ty)?; ocx.eq(&cause, param_env, mir_ty, ty)?;
// Prove the predicates coming along with `def_id`. // Prove the predicates coming along with `def_id`.
// //
@ -126,34 +74,31 @@ fn relate_mir_and_user_ty(
// outlives" error messages. // outlives" error messages.
let instantiated_predicates = tcx.predicates_of(def_id).instantiate(tcx, substs); let instantiated_predicates = tcx.predicates_of(def_id).instantiate(tcx, substs);
let cause = ObligationCause::dummy_with_span(self.span);
debug!(?instantiated_predicates); debug!(?instantiated_predicates);
for (instantiated_predicate, predicate_span) in for (instantiated_predicate, predicate_span) in
zip(instantiated_predicates.predicates, instantiated_predicates.spans) zip(instantiated_predicates.predicates, instantiated_predicates.spans)
{ {
let span = if self.span == DUMMY_SP { predicate_span } else { self.span }; let span = if span == DUMMY_SP { predicate_span } else { span };
let cause = ObligationCause::new( let cause = ObligationCause::new(
span, span,
hir::CRATE_HIR_ID, hir::CRATE_HIR_ID,
ObligationCauseCode::AscribeUserTypeProvePredicate(predicate_span), ObligationCauseCode::AscribeUserTypeProvePredicate(predicate_span),
); );
let instantiated_predicate = let instantiated_predicate =
self.normalize_with_cause(instantiated_predicate, cause.clone()); ocx.normalize(cause.clone(), param_env, instantiated_predicate);
self.prove_predicate(instantiated_predicate, cause);
ocx.register_obligation(Obligation::new(tcx, cause, param_env, instantiated_predicate));
} }
if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty { if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
let impl_self_ty = tcx.bound_type_of(impl_def_id).subst(tcx, substs); let impl_self_ty = tcx.bound_type_of(impl_def_id).subst(tcx, substs);
let impl_self_ty = self.normalize(impl_self_ty); let impl_self_ty = ocx.normalize(cause.clone(), param_env, impl_self_ty);
self.eq(self_ty, impl_self_ty)?; ocx.eq(&cause, param_env, self_ty, impl_self_ty)?;
self.prove_predicate( let predicate: Predicate<'tcx> =
ty::Binder::dummy(ty::PredicateKind::WellFormed(impl_self_ty.into())) ty::Binder::dummy(ty::PredicateKind::WellFormed(impl_self_ty.into())).to_predicate(tcx);
.to_predicate(tcx), ocx.register_obligation(Obligation::new(tcx, cause.clone(), param_env, predicate));
cause.clone(),
);
} }
// In addition to proving the predicates, we have to // In addition to proving the predicates, we have to
@ -167,13 +112,11 @@ fn relate_mir_and_user_ty(
// them? This would only be relevant if some input // them? This would only be relevant if some input
// type were ill-formed but did not appear in `ty`, // type were ill-formed but did not appear in `ty`,
// which...could happen with normalization... // which...could happen with normalization...
self.prove_predicate( let predicate: Predicate<'tcx> =
ty::Binder::dummy(ty::PredicateKind::WellFormed(ty.into())).to_predicate(tcx), ty::Binder::dummy(ty::PredicateKind::WellFormed(ty.into())).to_predicate(tcx);
cause, ocx.register_obligation(Obligation::new(tcx, cause, param_env, predicate));
);
Ok(()) Ok(())
} }
}
fn type_op_eq<'tcx>( fn type_op_eq<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,

View File

@ -23,7 +23,8 @@
#[stable(feature = "array_value_iter", since = "1.51.0")] #[stable(feature = "array_value_iter", since = "1.51.0")]
pub use iter::IntoIter; pub use iter::IntoIter;
/// Creates an array `[T; N]` where each array element `T` is returned by the `cb` call. /// Creates an array of type [T; N], where each element `T` is the returned value from `cb`
/// using that element's index.
/// ///
/// # Arguments /// # Arguments
/// ///
@ -36,8 +37,18 @@
/// // elements to produce is the length of array down there: only arrays of /// // elements to produce is the length of array down there: only arrays of
/// // equal lengths can be compared, so the const generic parameter `N` is /// // equal lengths can be compared, so the const generic parameter `N` is
/// // inferred to be 5, thus creating array of 5 elements. /// // inferred to be 5, thus creating array of 5 elements.
///
/// let array = core::array::from_fn(|i| i); /// let array = core::array::from_fn(|i| i);
/// // indexes are: 0 1 2 3 4
/// assert_eq!(array, [0, 1, 2, 3, 4]); /// assert_eq!(array, [0, 1, 2, 3, 4]);
///
/// let array2: [usize; 8] = core::array::from_fn(|i| i * 2);
/// // indexes are: 0 1 2 3 4 5 6 7
/// assert_eq!(array2, [0, 2, 4, 6, 8, 10, 12, 14]);
///
/// let bool_arr = core::array::from_fn::<_, 5, _>(|i| i % 2 == 0);
/// // indexes are: 0 1 2 3 4
/// assert_eq!(bool_arr, [true, false, true, false, true]);
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "array_from_fn", since = "1.63.0")] #[stable(feature = "array_from_fn", since = "1.63.0")]

View File

@ -949,7 +949,6 @@ so that we can apply CSS-filters to change the arrow color in themes */
#help dt { #help dt {
float: left; float: left;
clear: left; clear: left;
display: block;
margin-right: 0.5rem; margin-right: 0.5rem;
} }
#help span.top, #help span.bottom { #help span.top, #help span.bottom {

View File

@ -6,14 +6,19 @@
let _1: (); // in scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26 let _1: (); // in scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26
let _2: (); // in scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26 let _2: (); // in scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26
let _3: (); // in scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30 let _3: (); // in scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30
+ scope 1 (inlined instruction_set_default) { // at $DIR/inline_instruction_set.rs:53:5: 53:30 let _4: (); // in scope 0 at $DIR/inline_instruction_set.rs:+4:5: +4:41
+ scope 1 (inlined instruction_set_default) { // at $DIR/inline_instruction_set.rs:59:5: 59:30
+ }
+ scope 2 (inlined inline_always_and_using_inline_asm) { // at $DIR/inline_instruction_set.rs:60:5: 60:41
+ scope 3 {
+ }
+ } + }
bb0: { bb0: {
StorageLive(_1); // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26 StorageLive(_1); // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26
_1 = instruction_set_a32() -> bb1; // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26 _1 = instruction_set_a32() -> bb1; // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26
// mir::Constant // mir::Constant
// + span: $DIR/inline_instruction_set.rs:51:5: 51:24 // + span: $DIR/inline_instruction_set.rs:57:5: 57:24
// + literal: Const { ty: fn() {instruction_set_a32}, val: Value(<ZST>) } // + literal: Const { ty: fn() {instruction_set_a32}, val: Value(<ZST>) }
} }
@ -22,7 +27,7 @@
StorageLive(_2); // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26 StorageLive(_2); // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26
_2 = instruction_set_t32() -> bb2; // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26 _2 = instruction_set_t32() -> bb2; // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26
// mir::Constant // mir::Constant
// + span: $DIR/inline_instruction_set.rs:52:5: 52:24 // + span: $DIR/inline_instruction_set.rs:58:5: 58:24
// + literal: Const { ty: fn() {instruction_set_t32}, val: Value(<ZST>) } // + literal: Const { ty: fn() {instruction_set_t32}, val: Value(<ZST>) }
} }
@ -31,14 +36,25 @@
StorageLive(_3); // scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30 StorageLive(_3); // scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30
- _3 = instruction_set_default() -> bb3; // scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30 - _3 = instruction_set_default() -> bb3; // scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30
- // mir::Constant - // mir::Constant
- // + span: $DIR/inline_instruction_set.rs:53:5: 53:28 - // + span: $DIR/inline_instruction_set.rs:59:5: 59:28
- // + literal: Const { ty: fn() {instruction_set_default}, val: Value(<ZST>) } - // + literal: Const { ty: fn() {instruction_set_default}, val: Value(<ZST>) }
- } - }
- -
- bb3: { - bb3: {
StorageDead(_3); // scope 0 at $DIR/inline_instruction_set.rs:+3:30: +3:31 StorageDead(_3); // scope 0 at $DIR/inline_instruction_set.rs:+3:30: +3:31
_0 = const (); // scope 0 at $DIR/inline_instruction_set.rs:+0:18: +4:2 StorageLive(_4); // scope 0 at $DIR/inline_instruction_set.rs:+4:5: +4:41
return; // scope 0 at $DIR/inline_instruction_set.rs:+4:2: +4:2 - _4 = inline_always_and_using_inline_asm() -> bb4; // scope 0 at $DIR/inline_instruction_set.rs:+4:5: +4:41
- // mir::Constant
- // + span: $DIR/inline_instruction_set.rs:60:5: 60:39
- // + literal: Const { ty: fn() {inline_always_and_using_inline_asm}, val: Value(<ZST>) }
+ asm!("/* do nothing */", options((empty))) -> bb3; // scope 3 at $DIR/inline_instruction_set.rs:43:14: 43:38
}
- bb4: {
+ bb3: {
StorageDead(_4); // scope 0 at $DIR/inline_instruction_set.rs:+4:41: +4:42
_0 = const (); // scope 0 at $DIR/inline_instruction_set.rs:+0:18: +5:2
return; // scope 0 at $DIR/inline_instruction_set.rs:+5:2: +5:2
} }
} }

View File

@ -1,5 +1,7 @@
// Checks that only functions with the compatible instruction_set attributes are inlined. // Checks that only functions with the compatible instruction_set attributes are inlined.
// //
// A function is "compatible" when the *callee* has the same attribute or no attribute.
//
// compile-flags: --target thumbv4t-none-eabi // compile-flags: --target thumbv4t-none-eabi
// needs-llvm-components: arm // needs-llvm-components: arm
@ -36,14 +38,18 @@ fn instruction_set_t32() {}
#[inline] #[inline]
fn instruction_set_default() {} fn instruction_set_default() {}
#[inline(always)]
fn inline_always_and_using_inline_asm() {
unsafe { asm!("/* do nothing */") };
}
// EMIT_MIR inline_instruction_set.t32.Inline.diff // EMIT_MIR inline_instruction_set.t32.Inline.diff
#[instruction_set(arm::t32)] #[instruction_set(arm::t32)]
pub fn t32() { pub fn t32() {
instruction_set_a32(); instruction_set_a32();
instruction_set_t32(); instruction_set_t32();
// The default instruction set is currently
// conservatively assumed to be incompatible.
instruction_set_default(); instruction_set_default();
inline_always_and_using_inline_asm();
} }
// EMIT_MIR inline_instruction_set.default.Inline.diff // EMIT_MIR inline_instruction_set.default.Inline.diff
@ -51,4 +57,5 @@ pub fn default() {
instruction_set_a32(); instruction_set_a32();
instruction_set_t32(); instruction_set_t32();
instruction_set_default(); instruction_set_default();
inline_always_and_using_inline_asm();
} }

View File

@ -5,15 +5,18 @@
let mut _0: (); // return place in scope 0 at $DIR/inline_instruction_set.rs:+0:14: +0:14 let mut _0: (); // return place in scope 0 at $DIR/inline_instruction_set.rs:+0:14: +0:14
let _1: (); // in scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26 let _1: (); // in scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26
let _2: (); // in scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26 let _2: (); // in scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26
let _3: (); // in scope 0 at $DIR/inline_instruction_set.rs:+5:5: +5:30 let _3: (); // in scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30
+ scope 1 (inlined instruction_set_t32) { // at $DIR/inline_instruction_set.rs:43:5: 43:26 let _4: (); // in scope 0 at $DIR/inline_instruction_set.rs:+4:5: +4:41
+ scope 1 (inlined instruction_set_t32) { // at $DIR/inline_instruction_set.rs:50:5: 50:26
+ }
+ scope 2 (inlined instruction_set_default) { // at $DIR/inline_instruction_set.rs:51:5: 51:30
+ } + }
bb0: { bb0: {
StorageLive(_1); // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26 StorageLive(_1); // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26
_1 = instruction_set_a32() -> bb1; // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26 _1 = instruction_set_a32() -> bb1; // scope 0 at $DIR/inline_instruction_set.rs:+1:5: +1:26
// mir::Constant // mir::Constant
// + span: $DIR/inline_instruction_set.rs:42:5: 42:24 // + span: $DIR/inline_instruction_set.rs:49:5: 49:24
// + literal: Const { ty: fn() {instruction_set_a32}, val: Value(<ZST>) } // + literal: Const { ty: fn() {instruction_set_a32}, val: Value(<ZST>) }
} }
@ -22,25 +25,34 @@
StorageLive(_2); // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26 StorageLive(_2); // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26
- _2 = instruction_set_t32() -> bb2; // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26 - _2 = instruction_set_t32() -> bb2; // scope 0 at $DIR/inline_instruction_set.rs:+2:5: +2:26
- // mir::Constant - // mir::Constant
- // + span: $DIR/inline_instruction_set.rs:43:5: 43:24 - // + span: $DIR/inline_instruction_set.rs:50:5: 50:24
- // + literal: Const { ty: fn() {instruction_set_t32}, val: Value(<ZST>) } - // + literal: Const { ty: fn() {instruction_set_t32}, val: Value(<ZST>) }
- } - }
- -
- bb2: { - bb2: {
StorageDead(_2); // scope 0 at $DIR/inline_instruction_set.rs:+2:26: +2:27 StorageDead(_2); // scope 0 at $DIR/inline_instruction_set.rs:+2:26: +2:27
StorageLive(_3); // scope 0 at $DIR/inline_instruction_set.rs:+5:5: +5:30 StorageLive(_3); // scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30
- _3 = instruction_set_default() -> bb3; // scope 0 at $DIR/inline_instruction_set.rs:+5:5: +5:30 - _3 = instruction_set_default() -> bb3; // scope 0 at $DIR/inline_instruction_set.rs:+3:5: +3:30
+ _3 = instruction_set_default() -> bb2; // scope 0 at $DIR/inline_instruction_set.rs:+5:5: +5:30 - // mir::Constant
// mir::Constant - // + span: $DIR/inline_instruction_set.rs:51:5: 51:28
// + span: $DIR/inline_instruction_set.rs:46:5: 46:28 - // + literal: Const { ty: fn() {instruction_set_default}, val: Value(<ZST>) }
// + literal: Const { ty: fn() {instruction_set_default}, val: Value(<ZST>) } - }
} -
- bb3: { - bb3: {
StorageDead(_3); // scope 0 at $DIR/inline_instruction_set.rs:+3:30: +3:31
StorageLive(_4); // scope 0 at $DIR/inline_instruction_set.rs:+4:5: +4:41
- _4 = inline_always_and_using_inline_asm() -> bb4; // scope 0 at $DIR/inline_instruction_set.rs:+4:5: +4:41
+ _4 = inline_always_and_using_inline_asm() -> bb2; // scope 0 at $DIR/inline_instruction_set.rs:+4:5: +4:41
// mir::Constant
// + span: $DIR/inline_instruction_set.rs:52:5: 52:39
// + literal: Const { ty: fn() {inline_always_and_using_inline_asm}, val: Value(<ZST>) }
}
- bb4: {
+ bb2: { + bb2: {
StorageDead(_3); // scope 0 at $DIR/inline_instruction_set.rs:+5:30: +5:31 StorageDead(_4); // scope 0 at $DIR/inline_instruction_set.rs:+4:41: +4:42
_0 = const (); // scope 0 at $DIR/inline_instruction_set.rs:+0:14: +6:2 _0 = const (); // scope 0 at $DIR/inline_instruction_set.rs:+0:14: +5:2
return; // scope 0 at $DIR/inline_instruction_set.rs:+6:2: +6:2 return; // scope 0 at $DIR/inline_instruction_set.rs:+5:2: +5:2
} }
} }