forked from OSchip/llvm-project
[codegen] Ensure target flags are cleared/set properly. NFC.
- When an operand is changed into an immediate value or like, ensure their target flags being cleared or set properly. Differential Revision: https://reviews.llvm.org/D87109
This commit is contained in:
parent
052dbe226c
commit
bf41c4d29e
|
@ -728,12 +728,12 @@ public:
|
|||
/// ChangeToImmediate - Replace this operand with a new immediate operand of
|
||||
/// the specified value. If an operand is known to be an immediate already,
|
||||
/// the setImm method should be used.
|
||||
void ChangeToImmediate(int64_t ImmVal);
|
||||
void ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags = 0);
|
||||
|
||||
/// ChangeToFPImmediate - Replace this operand with a new FP immediate operand
|
||||
/// of the specified value. If an operand is known to be an FP immediate
|
||||
/// already, the setFPImm method should be used.
|
||||
void ChangeToFPImmediate(const ConstantFP *FPImm);
|
||||
void ChangeToFPImmediate(const ConstantFP *FPImm, unsigned TargetFlags = 0);
|
||||
|
||||
/// ChangeToES - Replace this operand with a new external symbol operand.
|
||||
void ChangeToES(const char *SymName, unsigned TargetFlags = 0);
|
||||
|
@ -743,10 +743,10 @@ public:
|
|||
unsigned TargetFlags = 0);
|
||||
|
||||
/// ChangeToMCSymbol - Replace this operand with a new MC symbol operand.
|
||||
void ChangeToMCSymbol(MCSymbol *Sym);
|
||||
void ChangeToMCSymbol(MCSymbol *Sym, unsigned TargetFlags = 0);
|
||||
|
||||
/// Replace this operand with a frame index.
|
||||
void ChangeToFrameIndex(int Idx);
|
||||
void ChangeToFrameIndex(int Idx, unsigned TargetFlags = 0);
|
||||
|
||||
/// Replace this operand with a target index.
|
||||
void ChangeToTargetIndex(unsigned Idx, int64_t Offset,
|
||||
|
|
|
@ -153,22 +153,25 @@ void MachineOperand::removeRegFromUses() {
|
|||
/// ChangeToImmediate - Replace this operand with a new immediate operand of
|
||||
/// the specified value. If an operand is known to be an immediate already,
|
||||
/// the setImm method should be used.
|
||||
void MachineOperand::ChangeToImmediate(int64_t ImmVal) {
|
||||
void MachineOperand::ChangeToImmediate(int64_t ImmVal, unsigned TargetFlags) {
|
||||
assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
|
||||
|
||||
removeRegFromUses();
|
||||
|
||||
OpKind = MO_Immediate;
|
||||
Contents.ImmVal = ImmVal;
|
||||
setTargetFlags(TargetFlags);
|
||||
}
|
||||
|
||||
void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm) {
|
||||
void MachineOperand::ChangeToFPImmediate(const ConstantFP *FPImm,
|
||||
unsigned TargetFlags) {
|
||||
assert((!isReg() || !isTied()) && "Cannot change a tied operand into an imm");
|
||||
|
||||
removeRegFromUses();
|
||||
|
||||
OpKind = MO_FPImmediate;
|
||||
Contents.CFP = FPImm;
|
||||
setTargetFlags(TargetFlags);
|
||||
}
|
||||
|
||||
void MachineOperand::ChangeToES(const char *SymName,
|
||||
|
@ -197,7 +200,7 @@ void MachineOperand::ChangeToGA(const GlobalValue *GV, int64_t Offset,
|
|||
setTargetFlags(TargetFlags);
|
||||
}
|
||||
|
||||
void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym) {
|
||||
void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym, unsigned TargetFlags) {
|
||||
assert((!isReg() || !isTied()) &&
|
||||
"Cannot change a tied operand into an MCSymbol");
|
||||
|
||||
|
@ -205,9 +208,10 @@ void MachineOperand::ChangeToMCSymbol(MCSymbol *Sym) {
|
|||
|
||||
OpKind = MO_MCSymbol;
|
||||
Contents.Sym = Sym;
|
||||
setTargetFlags(TargetFlags);
|
||||
}
|
||||
|
||||
void MachineOperand::ChangeToFrameIndex(int Idx) {
|
||||
void MachineOperand::ChangeToFrameIndex(int Idx, unsigned TargetFlags) {
|
||||
assert((!isReg() || !isTied()) &&
|
||||
"Cannot change a tied operand into a FrameIndex");
|
||||
|
||||
|
@ -215,6 +219,7 @@ void MachineOperand::ChangeToFrameIndex(int Idx) {
|
|||
|
||||
OpKind = MO_FrameIndex;
|
||||
setIndex(Idx);
|
||||
setTargetFlags(TargetFlags);
|
||||
}
|
||||
|
||||
void MachineOperand::ChangeToTargetIndex(unsigned Idx, int64_t Offset,
|
||||
|
|
|
@ -282,9 +282,6 @@ static bool updateOperand(FoldCandidate &Fold,
|
|||
assert(!Fold.needsShrink() && "not handled");
|
||||
|
||||
if (Fold.isImm()) {
|
||||
// FIXME: ChangeToImmediate should probably clear the subreg flags. It's
|
||||
// reinterpreted as TargetFlags.
|
||||
Old.setSubReg(0);
|
||||
Old.ChangeToImmediate(Fold.ImmToFold);
|
||||
return true;
|
||||
}
|
||||
|
@ -834,8 +831,6 @@ void SIFoldOperands::foldOperand(
|
|||
|
||||
UseMI->setDesc(TII->get(AMDGPU::S_MOV_B32));
|
||||
|
||||
// FIXME: ChangeToImmediate should clear subreg
|
||||
UseMI->getOperand(1).setSubReg(0);
|
||||
if (OpToFold.isImm())
|
||||
UseMI->getOperand(1).ChangeToImmediate(OpToFold.getImm());
|
||||
else
|
||||
|
|
|
@ -2656,7 +2656,6 @@ bool SIInstrInfo::FoldImmediate(MachineInstr &UseMI, MachineInstr &DefMI,
|
|||
|
||||
UseMI.setDesc(get(NewOpc));
|
||||
UseMI.getOperand(1).ChangeToImmediate(Imm.getSExtValue());
|
||||
UseMI.getOperand(1).setTargetFlags(0);
|
||||
UseMI.addImplicitDefUseOperands(*UseMI.getParent()->getParent());
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -86,13 +86,9 @@ static bool foldImmediates(MachineInstr &MI, const SIInstrInfo *TII,
|
|||
|
||||
if (MovSrc.isImm() && (isInt<32>(MovSrc.getImm()) ||
|
||||
isUInt<32>(MovSrc.getImm()))) {
|
||||
// It's possible to have only one component of a super-reg defined by
|
||||
// a single mov, so we need to clear any subregister flag.
|
||||
Src0.setSubReg(0);
|
||||
Src0.ChangeToImmediate(MovSrc.getImm());
|
||||
ConstantFolded = true;
|
||||
} else if (MovSrc.isFI()) {
|
||||
Src0.setSubReg(0);
|
||||
Src0.ChangeToFrameIndex(MovSrc.getIndex());
|
||||
ConstantFolded = true;
|
||||
} else if (MovSrc.isGlobal()) {
|
||||
|
|
Loading…
Reference in New Issue