| Index: src/IceTargetLoweringX8632.cpp
|
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
|
| index 68289408a1290f8dc53b58e1f7142c2ed2684de0..8a01f00d319c20cb87140906ba7559ee184edadd 100644
|
| --- a/src/IceTargetLoweringX8632.cpp
|
| +++ b/src/IceTargetLoweringX8632.cpp
|
| @@ -382,6 +382,7 @@ void TargetX8632::translateO2() {
|
| // associated cleanup, to make the dump cleaner and more useful.
|
| Func->dump("After initial x8632 codegen");
|
| Timer T_regAlloc;
|
| + Func->getVMetadata()->init();
|
| regAlloc();
|
| if (Func->hasError())
|
| return;
|
| @@ -1590,21 +1591,21 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| case InstArithmetic::Shl:
|
| _mov(T, Src0);
|
| if (!llvm::isa<Constant>(Src1))
|
| - Src1 = legalizeToVar(Src1, false, RegX8632::Reg_ecx);
|
| + Src1 = legalizeToVar(Src1, RegX8632::Reg_ecx);
|
| _shl(T, Src1);
|
| _mov(Dest, T);
|
| break;
|
| case InstArithmetic::Lshr:
|
| _mov(T, Src0);
|
| if (!llvm::isa<Constant>(Src1))
|
| - Src1 = legalizeToVar(Src1, false, RegX8632::Reg_ecx);
|
| + Src1 = legalizeToVar(Src1, RegX8632::Reg_ecx);
|
| _shr(T, Src1);
|
| _mov(Dest, T);
|
| break;
|
| case InstArithmetic::Ashr:
|
| _mov(T, Src0);
|
| if (!llvm::isa<Constant>(Src1))
|
| - Src1 = legalizeToVar(Src1, false, RegX8632::Reg_ecx);
|
| + Src1 = legalizeToVar(Src1, RegX8632::Reg_ecx);
|
| _sar(T, Src1);
|
| _mov(Dest, T);
|
| break;
|
| @@ -1725,9 +1726,8 @@ void TargetX8632::lowerAssign(const InstAssign *Inst) {
|
| _mov(T_Hi, Src0Hi);
|
| _mov(DestHi, T_Hi);
|
| } else {
|
| - const bool AllowOverlap = true;
|
| // RI is either a physical register or an immediate.
|
| - Operand *RI = legalize(Src0, Legal_Reg | Legal_Imm, AllowOverlap);
|
| + Operand *RI = legalize(Src0, Legal_Reg | Legal_Imm);
|
| if (isVectorType(Dest->getType()))
|
| _movp(Dest, RI);
|
| else
|
| @@ -1830,7 +1830,7 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| // code, as the memory operand displacements may end up being smaller
|
| // before any stack adjustment is done.
|
| for (SizeT i = 0, NumXmmArgs = XmmArgs.size(); i < NumXmmArgs; ++i) {
|
| - Variable *Reg = legalizeToVar(XmmArgs[i], false, RegX8632::Reg_xmm0 + i);
|
| + Variable *Reg = legalizeToVar(XmmArgs[i], RegX8632::Reg_xmm0 + i);
|
| // Generate a FakeUse of register arguments so that they do not get
|
| // dead code eliminated as a result of the FakeKill of scratch
|
| // registers after the call.
|
| @@ -1914,15 +1914,12 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| split64(Dest);
|
| Variable *DestLo = Dest->getLo();
|
| Variable *DestHi = Dest->getHi();
|
| - DestLo->setPreferredRegister(ReturnReg, false);
|
| - DestHi->setPreferredRegister(ReturnRegHi, false);
|
| _mov(DestLo, ReturnReg);
|
| _mov(DestHi, ReturnRegHi);
|
| } else {
|
| assert(Dest->getType() == IceType_i32 || Dest->getType() == IceType_i16 ||
|
| Dest->getType() == IceType_i8 || Dest->getType() == IceType_i1 ||
|
| isVectorType(Dest->getType()));
|
| - Dest->setPreferredRegister(ReturnReg, false);
|
| if (isVectorType(Dest->getType())) {
|
| _movp(Dest, ReturnReg);
|
| } else {
|
| @@ -2137,7 +2134,6 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| if (Dest->getType() == IceType_i1)
|
| _and(T_2, Ctx->getConstantInt32(IceType_i1, 1));
|
| _mov(Dest, T_2);
|
| - T_2->setPreferredRegister(T_1, true);
|
| }
|
| break;
|
| case InstCast::Fptoui:
|
| @@ -2174,7 +2170,6 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| if (Dest->getType() == IceType_i1)
|
| _and(T_2, Ctx->getConstantInt32(IceType_i1, 1));
|
| _mov(Dest, T_2);
|
| - T_2->setPreferredRegister(T_1, true);
|
| }
|
| break;
|
| case InstCast::Sitofp:
|
| @@ -2686,8 +2681,8 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
|
| if (Src0->getType() != IceType_i64 && !NextBr->isUnconditional() &&
|
| Dest == NextBr->getSrc(0) && NextBr->isLastUse(Dest)) {
|
| NextBr->setDeleted();
|
| - Operand *Src0RM = legalize(
|
| - Src0, IsSrc1ImmOrReg ? (Legal_Reg | Legal_Mem) : Legal_Reg, true);
|
| + Operand *Src0RM =
|
| + legalize(Src0, IsSrc1ImmOrReg ? (Legal_Reg | Legal_Mem) : Legal_Reg);
|
| _cmp(Src0RM, Src1);
|
| _br(getIcmp32Mapping(Inst->getCondition()), NextBr->getTargetTrue(),
|
| NextBr->getTargetFalse());
|
| @@ -2736,8 +2731,8 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
|
| }
|
|
|
| // cmp b, c
|
| - Operand *Src0RM = legalize(
|
| - Src0, IsSrc1ImmOrReg ? (Legal_Reg | Legal_Mem) : Legal_Reg, true);
|
| + Operand *Src0RM =
|
| + legalize(Src0, IsSrc1ImmOrReg ? (Legal_Reg | Legal_Mem) : Legal_Reg);
|
| InstX8632Label *Label = InstX8632Label::create(Func, this);
|
| _cmp(Src0RM, Src1);
|
| _mov(Dest, One);
|
| @@ -3588,7 +3583,8 @@ bool matchTransitiveAssign(const VariablesMetadata *VMetadata, Variable *&Var,
|
| // set Var:=SrcVar
|
| if (Var == NULL)
|
| return false;
|
| - if (const Inst *VarAssign = VMetadata->getDefinition(Var)) {
|
| + if (const Inst *VarAssign = VMetadata->getSingleDefinition(Var)) {
|
| + assert(!VMetadata->isMultiDef(Var));
|
| if (llvm::isa<InstAssign>(VarAssign)) {
|
| Operand *SrcOp = VarAssign->getSrc(0);
|
| assert(SrcOp);
|
| @@ -3615,9 +3611,10 @@ bool matchCombinedBaseIndex(const VariablesMetadata *VMetadata, Variable *&Base,
|
| return false;
|
| if (Index != NULL)
|
| return false;
|
| - const Inst *BaseInst = VMetadata->getDefinition(Base);
|
| + const Inst *BaseInst = VMetadata->getSingleDefinition(Base);
|
| if (BaseInst == NULL)
|
| return false;
|
| + assert(!VMetadata->isMultiDef(Base));
|
| if (BaseInst->getSrcSize() < 2)
|
| return false;
|
| if (Variable *Var1 = llvm::dyn_cast<Variable>(BaseInst->getSrc(0))) {
|
| @@ -3646,9 +3643,10 @@ bool matchShiftedIndex(const VariablesMetadata *VMetadata, Variable *&Index,
|
| // Index=Var, Shift+=log2(Const)
|
| if (Index == NULL)
|
| return false;
|
| - const Inst *IndexInst = VMetadata->getDefinition(Index);
|
| + const Inst *IndexInst = VMetadata->getSingleDefinition(Index);
|
| if (IndexInst == NULL)
|
| return false;
|
| + assert(!VMetadata->isMultiDef(Index));
|
| if (IndexInst->getSrcSize() < 2)
|
| return false;
|
| if (const InstArithmetic *ArithInst =
|
| @@ -3697,9 +3695,10 @@ bool matchOffsetBase(const VariablesMetadata *VMetadata, Variable *&Base,
|
| // set Base=Var, Offset-=Const
|
| if (Base == NULL)
|
| return false;
|
| - const Inst *BaseInst = VMetadata->getDefinition(Base);
|
| + const Inst *BaseInst = VMetadata->getSingleDefinition(Base);
|
| if (BaseInst == NULL)
|
| return false;
|
| + assert(!VMetadata->isMultiDef(Base));
|
| if (const InstArithmetic *ArithInst =
|
| llvm::dyn_cast<const InstArithmetic>(BaseInst)) {
|
| if (ArithInst->getOp() != InstArithmetic::Add &&
|
| @@ -3878,15 +3877,15 @@ void TargetX8632::lowerRet(const InstRet *Inst) {
|
| if (Inst->hasRetValue()) {
|
| Operand *Src0 = legalize(Inst->getRetValue());
|
| if (Src0->getType() == IceType_i64) {
|
| - Variable *eax = legalizeToVar(loOperand(Src0), false, RegX8632::Reg_eax);
|
| - Variable *edx = legalizeToVar(hiOperand(Src0), false, RegX8632::Reg_edx);
|
| + Variable *eax = legalizeToVar(loOperand(Src0), RegX8632::Reg_eax);
|
| + Variable *edx = legalizeToVar(hiOperand(Src0), RegX8632::Reg_edx);
|
| Reg = eax;
|
| Context.insert(InstFakeUse::create(Func, edx));
|
| } else if (Src0->getType() == IceType_f32 ||
|
| Src0->getType() == IceType_f64) {
|
| _fld(Src0);
|
| } else if (isVectorType(Src0->getType())) {
|
| - Reg = legalizeToVar(Src0, false, RegX8632::Reg_xmm0);
|
| + Reg = legalizeToVar(Src0, RegX8632::Reg_xmm0);
|
| } else {
|
| _mov(Reg, Src0, RegX8632::Reg_eax);
|
| }
|
| @@ -3973,8 +3972,8 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
|
| if (Dest->getType() == IceType_i64) {
|
| Variable *DestLo = llvm::cast<Variable>(loOperand(Dest));
|
| Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest));
|
| - Operand *SrcLoRI = legalize(loOperand(SrcT), Legal_Reg | Legal_Imm, true);
|
| - Operand *SrcHiRI = legalize(hiOperand(SrcT), Legal_Reg | Legal_Imm, true);
|
| + Operand *SrcLoRI = legalize(loOperand(SrcT), Legal_Reg | Legal_Imm);
|
| + Operand *SrcHiRI = legalize(hiOperand(SrcT), Legal_Reg | Legal_Imm);
|
| _cmp(ConditionRM, Zero);
|
| _mov(DestLo, SrcLoRI);
|
| _mov(DestHi, SrcHiRI);
|
| @@ -3983,17 +3982,17 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
|
| Context.insert(InstFakeUse::create(Func, DestHi));
|
| Operand *SrcFLo = loOperand(SrcF);
|
| Operand *SrcFHi = hiOperand(SrcF);
|
| - SrcLoRI = legalize(SrcFLo, Legal_Reg | Legal_Imm, true);
|
| - SrcHiRI = legalize(SrcFHi, Legal_Reg | Legal_Imm, true);
|
| + SrcLoRI = legalize(SrcFLo, Legal_Reg | Legal_Imm);
|
| + SrcHiRI = legalize(SrcFHi, Legal_Reg | Legal_Imm);
|
| _mov(DestLo, SrcLoRI);
|
| _mov(DestHi, SrcHiRI);
|
| } else {
|
| _cmp(ConditionRM, Zero);
|
| - SrcT = legalize(SrcT, Legal_Reg | Legal_Imm, true);
|
| + SrcT = legalize(SrcT, Legal_Reg | Legal_Imm);
|
| _mov(Dest, SrcT);
|
| _br(CondX86::Br_ne, Label);
|
| Context.insert(InstFakeUse::create(Func, Dest));
|
| - SrcF = legalize(SrcF, Legal_Reg | Legal_Imm, true);
|
| + SrcF = legalize(SrcF, Legal_Reg | Legal_Imm);
|
| _mov(Dest, SrcF);
|
| }
|
|
|
| @@ -4008,14 +4007,14 @@ void TargetX8632::lowerStore(const InstStore *Inst) {
|
|
|
| if (Ty == IceType_i64) {
|
| Value = legalize(Value);
|
| - Operand *ValueHi = legalize(hiOperand(Value), Legal_Reg | Legal_Imm, true);
|
| - Operand *ValueLo = legalize(loOperand(Value), Legal_Reg | Legal_Imm, true);
|
| + Operand *ValueHi = legalize(hiOperand(Value), Legal_Reg | Legal_Imm);
|
| + Operand *ValueLo = legalize(loOperand(Value), Legal_Reg | Legal_Imm);
|
| _store(ValueHi, llvm::cast<OperandX8632Mem>(hiOperand(NewAddr)));
|
| _store(ValueLo, llvm::cast<OperandX8632Mem>(loOperand(NewAddr)));
|
| } else if (isVectorType(Ty)) {
|
| _storep(legalizeToVar(Value), NewAddr);
|
| } else {
|
| - Value = legalize(Value, Legal_Reg | Legal_Imm, true);
|
| + Value = legalize(Value, Legal_Reg | Legal_Imm);
|
| _store(Value, NewAddr);
|
| }
|
| }
|
| @@ -4054,7 +4053,7 @@ void TargetX8632::lowerSwitch(const InstSwitch *Inst) {
|
| if (NumCases >= 2)
|
| Src0 = legalizeToVar(Src0, true);
|
| else
|
| - Src0 = legalize(Src0, Legal_Reg | Legal_Mem, true);
|
| + Src0 = legalize(Src0, Legal_Reg | Legal_Mem);
|
| for (SizeT I = 0; I < NumCases; ++I) {
|
| // TODO(stichnot): Correct lowering for IceType_i64.
|
| Constant *Value = Ctx->getConstantInt32(IceType_i32, Inst->getValue(I));
|
| @@ -4209,7 +4208,7 @@ Variable *TargetX8632::copyToReg(Operand *Src, int32_t RegNum) {
|
| }
|
|
|
| Operand *TargetX8632::legalize(Operand *From, LegalMask Allowed,
|
| - bool AllowOverlap, int32_t RegNum) {
|
| + int32_t RegNum) {
|
| // Assert that a physical register is allowed. To date, all calls
|
| // to legalize() allow a physical register. If a physical register
|
| // needs to be explicitly disallowed, then new code will need to be
|
| @@ -4228,10 +4227,10 @@ Operand *TargetX8632::legalize(Operand *From, LegalMask Allowed,
|
| Variable *RegBase = NULL;
|
| Variable *RegIndex = NULL;
|
| if (Base) {
|
| - RegBase = legalizeToVar(Base, true);
|
| + RegBase = legalizeToVar(Base);
|
| }
|
| if (Index) {
|
| - RegIndex = legalizeToVar(Index, true);
|
| + RegIndex = legalizeToVar(Index);
|
| }
|
| if (Base != RegBase || Index != RegIndex) {
|
| From = OperandX8632Mem::create(
|
| @@ -4293,11 +4292,7 @@ Operand *TargetX8632::legalize(Operand *From, LegalMask Allowed,
|
| // RegNum is required and Var->getRegNum() doesn't match.
|
| if ((!(Allowed & Legal_Mem) && !MustHaveRegister) ||
|
| (RegNum != Variable::NoRegister && RegNum != Var->getRegNum())) {
|
| - Variable *Reg = copyToReg(From, RegNum);
|
| - if (RegNum == Variable::NoRegister) {
|
| - Reg->setPreferredRegister(Var, AllowOverlap);
|
| - }
|
| - From = Reg;
|
| + From = copyToReg(From, RegNum);
|
| }
|
| return From;
|
| }
|
| @@ -4306,9 +4301,8 @@ Operand *TargetX8632::legalize(Operand *From, LegalMask Allowed,
|
| }
|
|
|
| // Provide a trivial wrapper to legalize() for this common usage.
|
| -Variable *TargetX8632::legalizeToVar(Operand *From, bool AllowOverlap,
|
| - int32_t RegNum) {
|
| - return llvm::cast<Variable>(legalize(From, Legal_Reg, AllowOverlap, RegNum));
|
| +Variable *TargetX8632::legalizeToVar(Operand *From, int32_t RegNum) {
|
| + return llvm::cast<Variable>(legalize(From, Legal_Reg, RegNum));
|
| }
|
|
|
| OperandX8632Mem *TargetX8632::FormMemoryOperand(Operand *Operand, Type Ty) {
|
|
|