PeepholeOptimizer: Ignore dead implicit defs

Target-specific instructions may have uninteresting physreg clobbers,
for target-specific reasons. The peephole pass doesn't need to concern
itself with such defs, as long as they're implicit and marked as dead.

llvm-svn: 255182
This commit is contained in:
Dan Gohman 2015-12-10 00:37:51 +00:00
parent a8483755d3
commit dab313e0ed
2 changed files with 34 additions and 0 deletions

View File

@ -1343,6 +1343,9 @@ bool PeepholeOptimizer::foldImmediate(MachineInstr *MI, MachineBasicBlock *MBB,
MachineOperand &MO = MI->getOperand(i);
if (!MO.isReg() || MO.isDef())
continue;
// Ignore dead implicit defs.
if (MO.isImplicit() && MO.isDead())
continue;
unsigned Reg = MO.getReg();
if (!TargetRegisterInfo::isVirtualRegister(Reg))
continue;
@ -1703,6 +1706,9 @@ ValueTrackerResult ValueTracker::getNextSourceFromBitcast() {
const MachineOperand &MO = Def->getOperand(OpIdx);
if (!MO.isReg() || !MO.getReg())
continue;
// Ignore dead implicit defs.
if (MO.isImplicit() && MO.isDead())
continue;
assert(!MO.isDef() && "We should have skipped all the definitions by now");
if (SrcIdx != EndOpIdx)
// Multiple sources?

View File

@ -225,3 +225,31 @@ define i64 @anyext(i32 %x) {
%w = shl i64 %y, 32
ret i64 %w
}
; CHECK-LABEL: bitcast_i32_to_float:
; CHECK: f32.reinterpret/i32 $push0=, $0{{$}}
define float @bitcast_i32_to_float(i32 %a) {
%t = bitcast i32 %a to float
ret float %t
}
; CHECK-LABEL: bitcast_float_to_i32:
; CHECK: i32.reinterpret/f32 $push0=, $0{{$}}
define i32 @bitcast_float_to_i32(float %a) {
%t = bitcast float %a to i32
ret i32 %t
}
; CHECK-LABEL: bitcast_i64_to_double:
; CHECK: f64.reinterpret/i64 $push0=, $0{{$}}
define double @bitcast_i64_to_double(i64 %a) {
%t = bitcast i64 %a to double
ret double %t
}
; CHECK-LABEL: bitcast_double_to_i64:
; CHECK: i64.reinterpret/f64 $push0=, $0{{$}}
define i64 @bitcast_double_to_i64(double %a) {
%t = bitcast double %a to i64
ret i64 %t
}