Merge commit '9a0c32934e
' into sync_cg_clif-2021-03-05
This commit is contained in:
commit
7a6ea77473
73 changed files with 1145 additions and 2596 deletions
|
@ -15,10 +15,7 @@ pub(super) fn optimize_function(ctx: &mut Context, cold_blocks: &EntitySet<Block
|
|||
// bytecodealliance/cranelift#1339 is implemented.
|
||||
|
||||
let mut block_insts = FxHashMap::default();
|
||||
for block in cold_blocks
|
||||
.keys()
|
||||
.filter(|&block| cold_blocks.contains(block))
|
||||
{
|
||||
for block in cold_blocks.keys().filter(|&block| cold_blocks.contains(block)) {
|
||||
let insts = ctx.func.layout.block_insts(block).collect::<Vec<_>>();
|
||||
for &inst in &insts {
|
||||
ctx.func.layout.remove_inst(inst);
|
||||
|
@ -28,10 +25,7 @@ pub(super) fn optimize_function(ctx: &mut Context, cold_blocks: &EntitySet<Block
|
|||
}
|
||||
|
||||
// And then append them at the back again.
|
||||
for block in cold_blocks
|
||||
.keys()
|
||||
.filter(|&block| cold_blocks.contains(block))
|
||||
{
|
||||
for block in cold_blocks.keys().filter(|&block| cold_blocks.contains(block)) {
|
||||
ctx.func.layout.append_block(block);
|
||||
for inst in block_insts.remove(&block).unwrap() {
|
||||
ctx.func.layout.append_inst(inst, block);
|
||||
|
|
|
@ -19,7 +19,12 @@ pub(crate) fn optimize_function<'tcx>(
|
|||
if tcx.sess.opts.optimize == rustc_session::config::OptLevel::No {
|
||||
return; // FIXME classify optimizations over opt levels
|
||||
}
|
||||
self::stack2reg::optimize_function(ctx, clif_comments);
|
||||
|
||||
// FIXME(#1142) stack2reg miscompiles lewton
|
||||
if false {
|
||||
self::stack2reg::optimize_function(ctx, clif_comments);
|
||||
}
|
||||
|
||||
crate::pretty_clif::write_clif_file(tcx, "stack2reg", None, instance, &ctx, &*clif_comments);
|
||||
crate::base::verify_func(tcx, &*clif_comments, &ctx.func);
|
||||
}
|
||||
|
|
|
@ -10,10 +10,7 @@ use cranelift_frontend::FunctionBuilder;
|
|||
pub(crate) fn maybe_unwrap_bint(bcx: &mut FunctionBuilder<'_>, arg: Value) -> Value {
|
||||
if let ValueDef::Result(arg_inst, 0) = bcx.func.dfg.value_def(arg) {
|
||||
match bcx.func.dfg[arg_inst] {
|
||||
InstructionData::Unary {
|
||||
opcode: Opcode::Bint,
|
||||
arg,
|
||||
} => arg,
|
||||
InstructionData::Unary { opcode: Opcode::Bint, arg } => arg,
|
||||
_ => arg,
|
||||
}
|
||||
} else {
|
||||
|
@ -54,12 +51,7 @@ pub(crate) fn make_branchable_value(bcx: &mut FunctionBuilder<'_>, arg: Value) -
|
|||
|
||||
match bcx.func.dfg[arg_inst] {
|
||||
// This is the lowering of Rvalue::Not
|
||||
InstructionData::Load {
|
||||
opcode: Opcode::Load,
|
||||
arg: ptr,
|
||||
flags,
|
||||
offset,
|
||||
} => {
|
||||
InstructionData::Load { opcode: Opcode::Load, arg: ptr, flags, offset } => {
|
||||
// Using `load.i8 + uextend.i32` would legalize to `uload8 + ireduce.i8 +
|
||||
// uextend.i32`. Just `uload8` is much faster.
|
||||
match bcx.func.dfg.ctrl_typevar(arg_inst) {
|
||||
|
@ -95,20 +87,14 @@ pub(crate) fn maybe_known_branch_taken(
|
|||
};
|
||||
|
||||
match bcx.func.dfg[arg_inst] {
|
||||
InstructionData::UnaryBool {
|
||||
opcode: Opcode::Bconst,
|
||||
imm,
|
||||
} => {
|
||||
InstructionData::UnaryBool { opcode: Opcode::Bconst, imm } => {
|
||||
if test_zero {
|
||||
Some(!imm)
|
||||
} else {
|
||||
Some(imm)
|
||||
}
|
||||
}
|
||||
InstructionData::UnaryImm {
|
||||
opcode: Opcode::Iconst,
|
||||
imm,
|
||||
} => {
|
||||
InstructionData::UnaryImm { opcode: Opcode::Iconst, imm } => {
|
||||
if test_zero {
|
||||
Some(imm.bits() == 0)
|
||||
} else {
|
||||
|
|
|
@ -175,16 +175,14 @@ impl<'a> OptimizeContext<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
OptimizeContext {
|
||||
ctx,
|
||||
stack_slot_usage_map,
|
||||
}
|
||||
OptimizeContext { ctx, stack_slot_usage_map }
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn optimize_function(
|
||||
ctx: &mut Context,
|
||||
#[cfg_attr(not(debug_assertions), allow(unused_variables))] clif_comments: &mut crate::pretty_clif::CommentWriter,
|
||||
#[cfg_attr(not(debug_assertions), allow(unused_variables))]
|
||||
clif_comments: &mut crate::pretty_clif::CommentWriter,
|
||||
) {
|
||||
combine_stack_addr_with_load_store(&mut ctx.func);
|
||||
|
||||
|
@ -296,12 +294,7 @@ fn combine_stack_addr_with_load_store(func: &mut Function) {
|
|||
while let Some(_block) = cursor.next_block() {
|
||||
while let Some(inst) = cursor.next_inst() {
|
||||
match cursor.func.dfg[inst] {
|
||||
InstructionData::Load {
|
||||
opcode: Opcode::Load,
|
||||
arg: addr,
|
||||
flags: _,
|
||||
offset,
|
||||
} => {
|
||||
InstructionData::Load { opcode: Opcode::Load, arg: addr, flags: _, offset } => {
|
||||
if cursor.func.dfg.ctrl_typevar(inst) == types::I128
|
||||
|| cursor.func.dfg.ctrl_typevar(inst).is_vector()
|
||||
{
|
||||
|
@ -391,20 +384,14 @@ fn remove_unused_stack_addr_and_stack_load(opt_ctx: &mut OptimizeContext<'_>) {
|
|||
stack_slot_users
|
||||
.stack_addr
|
||||
.drain_filter(|inst| {
|
||||
stack_addr_load_insts_users
|
||||
.get(inst)
|
||||
.map(|users| users.is_empty())
|
||||
.unwrap_or(true)
|
||||
stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true)
|
||||
})
|
||||
.for_each(|inst| StackSlotUsage::remove_unused_stack_addr(&mut func, inst));
|
||||
|
||||
stack_slot_users
|
||||
.stack_load
|
||||
.drain_filter(|inst| {
|
||||
stack_addr_load_insts_users
|
||||
.get(inst)
|
||||
.map(|users| users.is_empty())
|
||||
.unwrap_or(true)
|
||||
stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true)
|
||||
})
|
||||
.for_each(|inst| StackSlotUsage::remove_unused_load(&mut func, inst));
|
||||
}
|
||||
|
@ -415,11 +402,8 @@ fn try_get_stack_slot_and_offset_for_addr(
|
|||
addr: Value,
|
||||
) -> Option<(StackSlot, Offset32)> {
|
||||
if let ValueDef::Result(addr_inst, 0) = func.dfg.value_def(addr) {
|
||||
if let InstructionData::StackLoad {
|
||||
opcode: Opcode::StackAddr,
|
||||
stack_slot,
|
||||
offset,
|
||||
} = func.dfg[addr_inst]
|
||||
if let InstructionData::StackLoad { opcode: Opcode::StackAddr, stack_slot, offset } =
|
||||
func.dfg[addr_inst]
|
||||
{
|
||||
return Some((stack_slot, offset));
|
||||
}
|
||||
|
@ -437,16 +421,8 @@ enum SpatialOverlap {
|
|||
fn spatial_overlap(func: &Function, src: Inst, dest: Inst) -> SpatialOverlap {
|
||||
fn inst_info(func: &Function, inst: Inst) -> (StackSlot, Offset32, u32) {
|
||||
match func.dfg[inst] {
|
||||
InstructionData::StackLoad {
|
||||
opcode: Opcode::StackAddr,
|
||||
stack_slot,
|
||||
offset,
|
||||
}
|
||||
| InstructionData::StackLoad {
|
||||
opcode: Opcode::StackLoad,
|
||||
stack_slot,
|
||||
offset,
|
||||
}
|
||||
InstructionData::StackLoad { opcode: Opcode::StackAddr, stack_slot, offset }
|
||||
| InstructionData::StackLoad { opcode: Opcode::StackLoad, stack_slot, offset }
|
||||
| InstructionData::StackStore {
|
||||
opcode: Opcode::StackStore,
|
||||
stack_slot,
|
||||
|
@ -471,10 +447,7 @@ fn spatial_overlap(func: &Function, src: Inst, dest: Inst) -> SpatialOverlap {
|
|||
}
|
||||
|
||||
let src_end: i64 = src_offset.try_add_i64(i64::from(src_size)).unwrap().into();
|
||||
let dest_end: i64 = dest_offset
|
||||
.try_add_i64(i64::from(dest_size))
|
||||
.unwrap()
|
||||
.into();
|
||||
let dest_end: i64 = dest_offset.try_add_i64(i64::from(dest_size)).unwrap().into();
|
||||
if src_end <= dest_offset.into() || dest_end <= src_offset.into() {
|
||||
return SpatialOverlap::No;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue