return Reg;
}
+/// UpdateValueMap - Update the value map to include the new mapping for this
+/// instruction, or insert an extra copy to get the result in a previous
+/// determined register.
+/// NOTE: This is only necessary because we might select a block that uses
+/// a value before we select the block that defines the value. It might be
+/// possible to fix this by selecting blocks in reverse postorder.
+void FastISel::UpdateValueMap(Instruction* I, unsigned Reg,
+ DenseMap<const Value*, unsigned> &ValueMap) {
+ if (!ValueMap.count(I))
+ ValueMap[I] = Reg;
+ else
+ TII.copyRegToReg(*MBB, MBB->end(), ValueMap[I],
+ Reg, MRI.getRegClass(Reg), MRI.getRegClass(Reg));
+}
+
/// SelectBinaryOp - Select and emit code for a binary operator instruction,
/// which has an opcode which directly corresponds to the given ISD opcode.
///
ISDOpcode, Op0, CI->getZExtValue());
if (ResultReg != 0) {
// We successfully emitted code for the given LLVM Instruction.
- ValueMap[I] = ResultReg;
+ UpdateValueMap(I, ResultReg, ValueMap);
return true;
}
}
ISDOpcode, Op0, CF);
if (ResultReg != 0) {
// We successfully emitted code for the given LLVM Instruction.
- ValueMap[I] = ResultReg;
+ UpdateValueMap(I, ResultReg, ValueMap);
return true;
}
}
return false;
// We successfully emitted code for the given LLVM Instruction.
- ValueMap[I] = ResultReg;
+ UpdateValueMap(I, ResultReg, ValueMap);
return true;
}
}
// We successfully emitted code for the given LLVM Instruction.
- ValueMap[I] = N;
+ UpdateValueMap(I, N, ValueMap);
return true;
}
if (!ResultReg)
return false;
- ValueMap[I] = ResultReg;
+ UpdateValueMap(I, ResultReg, ValueMap);
return true;
}
unsigned Reg = getRegForValue(I->getOperand(0), ValueMap);
if (Reg == 0)
return false;
- ValueMap[I] = Reg;
+ UpdateValueMap(I, Reg, ValueMap);
return true;
}
if (!ResultReg)
return false;
- ValueMap[I] = ResultReg;
+ UpdateValueMap(I, ResultReg, ValueMap);
return true;
}
MVT DstVT = TLI.getValueType(I->getType());
if (SrcVT.getSimpleVT() == DstVT.getSimpleVT()) {
if (ValueMap[I->getOperand(0)]) {
- ValueMap[I] = ValueMap[I->getOperand(0)];
+ UpdateValueMap(I, ValueMap[I->getOperand(0)], ValueMap);
break;
} else
// Unhandled operand