1 //! Routines for manipulating the control-flow graph.
4 use rustc_middle
::mir
::*;
5 use rustc_middle
::ty
::{self, TyCtxt}
;
8 crate fn block_data(&self, blk
: BasicBlock
) -> &BasicBlockData
<'tcx
> {
9 &self.basic_blocks
[blk
]
12 crate fn block_data_mut(&mut self, blk
: BasicBlock
) -> &mut BasicBlockData
<'tcx
> {
13 &mut self.basic_blocks
[blk
]
16 // llvm.org/PR32488 makes this function use an excess of stack space. Mark
17 // it as #[inline(never)] to keep rustc's stack use in check.
19 crate fn start_new_block(&mut self) -> BasicBlock
{
20 self.basic_blocks
.push(BasicBlockData
::new(None
))
23 crate fn start_new_cleanup_block(&mut self) -> BasicBlock
{
24 let bb
= self.start_new_block();
25 self.block_data_mut(bb
).is_cleanup
= true;
29 crate fn push(&mut self, block
: BasicBlock
, statement
: Statement
<'tcx
>) {
30 debug
!("push({:?}, {:?})", block
, statement
);
31 self.block_data_mut(block
).statements
.push(statement
);
37 source_info
: SourceInfo
,
43 Statement { source_info, kind: StatementKind::Assign(box (place, rvalue)) }
,
47 crate fn push_assign_constant(
50 source_info
: SourceInfo
,
52 constant
: Constant
<'tcx
>,
54 self.push_assign(block
, source_info
, temp
, Rvalue
::Use(Operand
::Constant(box constant
)));
57 crate fn push_assign_unit(
60 source_info
: SourceInfo
,
68 Rvalue
::Use(Operand
::Constant(box Constant
{
69 span
: source_info
.span
,
71 literal
: ty
::Const
::zero_sized(tcx
, tcx
.types
.unit
).into(),
76 crate fn push_fake_read(
79 source_info
: SourceInfo
,
83 let kind
= StatementKind
::FakeRead(cause
, box place
);
84 let stmt
= Statement { source_info, kind }
;
85 self.push(block
, stmt
);
91 source_info
: SourceInfo
,
92 kind
: TerminatorKind
<'tcx
>,
94 debug
!("terminating block {:?} <- {:?}", block
, kind
);
96 self.block_data(block
).terminator
.is_none(),
97 "terminate: block {:?}={:?} already has a terminator set",
99 self.block_data(block
)
101 self.block_data_mut(block
).terminator
= Some(Terminator { source_info, kind }
);
104 /// In the `origin` block, push a `goto -> target` terminator.
105 crate fn goto(&mut self, origin
: BasicBlock
, source_info
: SourceInfo
, target
: BasicBlock
) {
106 self.terminate(origin
, source_info
, TerminatorKind
::Goto { target }
)