Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: src/IceTargetLoweringX8632.cpp

Issue 432613002: Subzero: Fix some issues related to legalization and undef handling. (Closed) Base URL: https://gerrit.chromium.org/gerrit/p/native_client/pnacl-subzero.git@master
Patch Set: Address comments Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceOperand.h ('k') | tests_lit/llvm2ice_tests/regalloc_evict_non_overlap.ll » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceTargetLoweringX8632.cpp
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
index 72e9a055a48a5b638cd0f56dae036674dcf73f4c..a5704b530a20158506602b4271ed386faedc6838 100644
--- a/src/IceTargetLoweringX8632.cpp
+++ b/src/IceTargetLoweringX8632.cpp
@@ -1249,7 +1249,7 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
if (TypesAreValidForPmull && InstructionSetIsValidForPmull) {
Variable *T = makeReg(Dest->getType());
_movp(T, Src0);
- _pmull(T, legalizeToVar(Src1));
+ _pmull(T, LEGAL_HACK(Src1));
_movp(Dest, T);
} else if (Dest->getType() == IceType_v4i32) {
// Lowering sequence:
@@ -2159,17 +2159,17 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
}
void TargetX8632::lowerExtractElement(const InstExtractElement *Inst) {
- Operand *SourceVectOperand = Inst->getSrc(0);
+ Operand *SourceVectNotLegalized = Inst->getSrc(0);
ConstantInteger *ElementIndex =
llvm::dyn_cast<ConstantInteger>(Inst->getSrc(1));
// Only constant indices are allowed in PNaCl IR.
assert(ElementIndex);
unsigned Index = ElementIndex->getValue();
- Type Ty = SourceVectOperand->getType();
+ Type Ty = SourceVectNotLegalized->getType();
Type ElementTy = typeElementType(Ty);
Type InVectorElementTy = getInVectorElementType(Ty);
- Variable *ExtractedElement = makeReg(InVectorElementTy);
+ Variable *ExtractedElementR = makeReg(InVectorElementTy);
// TODO(wala): Determine the best lowering sequences for each type.
bool CanUsePextr =
@@ -2177,8 +2177,8 @@ void TargetX8632::lowerExtractElement(const InstExtractElement *Inst) {
if (CanUsePextr && Ty != IceType_v4f32) {
// Use pextrb, pextrw, or pextrd.
Constant *Mask = Ctx->getConstantInt(IceType_i8, Index);
- Variable *SourceVectR = legalizeToVar(SourceVectOperand);
- _pextr(ExtractedElement, SourceVectR, Mask);
+ Variable *SourceVectR = legalizeToVar(SourceVectNotLegalized);
+ _pextr(ExtractedElementR, SourceVectR, Mask);
} else if (Ty == IceType_v4i32 || Ty == IceType_v4f32 || Ty == IceType_v4i1) {
// Use pshufd and movd/movss.
//
@@ -2186,58 +2186,60 @@ void TargetX8632::lowerExtractElement(const InstExtractElement *Inst) {
// require aligned memory operands until support for stack alignment
// is implemented.
#define ALIGN_HACK(Vect) legalizeToVar((Vect))
+ Operand *SourceVectRM =
+ legalize(SourceVectNotLegalized, Legal_Reg | Legal_Mem);
Variable *T = NULL;
if (Index) {
// The shuffle only needs to occur if the element to be extracted
// is not at the lowest index.
Constant *Mask = Ctx->getConstantInt(IceType_i8, Index);
T = makeReg(Ty);
- _pshufd(T, ALIGN_HACK(SourceVectOperand), Mask);
+ _pshufd(T, ALIGN_HACK(SourceVectRM), Mask);
} else {
- T = legalizeToVar(SourceVectOperand);
+ T = ALIGN_HACK(SourceVectRM);
}
if (InVectorElementTy == IceType_i32) {
- _movd(ExtractedElement, T);
+ _movd(ExtractedElementR, T);
} else { // Ty == Icetype_f32
// TODO(wala): _movss is only used here because _mov does not
// allow a vector source and a scalar destination. _mov should be
// able to be used here.
// _movss is a binary instruction, so the FakeDef is needed to
// keep the live range analysis consistent.
- Context.insert(InstFakeDef::create(Func, ExtractedElement));
- _movss(ExtractedElement, T);
+ Context.insert(InstFakeDef::create(Func, ExtractedElementR));
+ _movss(ExtractedElementR, T);
}
#undef ALIGN_HACK
} else {
assert(Ty == IceType_v16i8 || Ty == IceType_v16i1);
// Spill the value to a stack slot and do the extraction in memory.
//
- // TODO(wala): use legalize(SourceVectOperand, Legal_Mem) when
+ // TODO(wala): use legalize(SourceVectNotLegalized, Legal_Mem) when
// support for legalizing to mem is implemented.
Variable *Slot = Func->makeVariable(Ty, Context.getNode());
Slot->setWeight(RegWeight::Zero);
- _movp(Slot, legalizeToVar(SourceVectOperand));
+ _movp(Slot, legalizeToVar(SourceVectNotLegalized));
// Compute the location of the element in memory.
unsigned Offset = Index * typeWidthInBytes(InVectorElementTy);
OperandX8632Mem *Loc =
getMemoryOperandForStackSlot(InVectorElementTy, Slot, Offset);
- _mov(ExtractedElement, Loc);
+ _mov(ExtractedElementR, Loc);
}
if (ElementTy == IceType_i1) {
// Truncate extracted integers to i1s if necessary.
Variable *T = makeReg(IceType_i1);
InstCast *Cast =
- InstCast::create(Func, InstCast::Trunc, T, ExtractedElement);
+ InstCast::create(Func, InstCast::Trunc, T, ExtractedElementR);
lowerCast(Cast);
- ExtractedElement = T;
+ ExtractedElementR = T;
}
// Copy the element to the destination.
Variable *Dest = Inst->getDest();
- _mov(Dest, ExtractedElement);
+ _mov(Dest, ExtractedElementR);
}
void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
@@ -2258,48 +2260,52 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
Variable *T = NULL;
- // ALIGNHACK: Without support for stack alignment, both operands to
- // cmpps need to be forced into registers. Once support for stack
- // alignment is implemented, remove LEGAL_HACK.
-#define LEGAL_HACK(Vect) legalizeToVar((Vect))
- switch (Condition) {
- default: {
- InstX8632Cmpps::CmppsCond Predicate = TableFcmp[Index].Predicate;
- assert(Predicate != InstX8632Cmpps::Cmpps_Invalid);
- T = makeReg(Src0->getType());
- _movp(T, Src0);
- _cmpps(T, LEGAL_HACK(Src1), Predicate);
- } break;
- case InstFcmp::False:
- T = makeVectorOfZeros(Src0->getType());
- break;
- case InstFcmp::One: {
- // Check both unequal and ordered.
- T = makeReg(Src0->getType());
- Variable *T2 = makeReg(Src0->getType());
- Src1 = LEGAL_HACK(Src1);
- _movp(T, Src0);
- _cmpps(T, Src1, InstX8632Cmpps::Cmpps_neq);
- _movp(T2, Src0);
- _cmpps(T2, Src1, InstX8632Cmpps::Cmpps_ord);
- _pand(T, T2);
- } break;
- case InstFcmp::Ueq: {
- // Check both equal or unordered.
- T = makeReg(Src0->getType());
- Variable *T2 = makeReg(Src0->getType());
- Src1 = LEGAL_HACK(Src1);
- _movp(T, Src0);
- _cmpps(T, Src1, InstX8632Cmpps::Cmpps_eq);
- _movp(T2, Src0);
- _cmpps(T2, Src1, InstX8632Cmpps::Cmpps_unord);
- _por(T, T2);
- } break;
- case InstFcmp::True:
+ if (Condition == InstFcmp::True) {
+ // makeVectorOfOnes() requires an integer vector type.
T = makeVectorOfMinusOnes(IceType_v4i32);
- break;
- }
+ } else if (Condition == InstFcmp::False) {
+ T = makeVectorOfZeros(Dest->getType());
+ } else {
+ Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem);
+ Operand *Src1RM = legalize(Src1, Legal_Reg | Legal_Mem);
+
+ // ALIGNHACK: Without support for stack alignment, both operands to
+ // cmpps need to be forced into registers. Once support for stack
+ // alignment is implemented, remove LEGAL_HACK.
+#define LEGAL_HACK(Vect) legalizeToVar((Vect))
+ switch (Condition) {
+ default: {
+ InstX8632Cmpps::CmppsCond Predicate = TableFcmp[Index].Predicate;
+ assert(Predicate != InstX8632Cmpps::Cmpps_Invalid);
+ T = makeReg(Src0RM->getType());
+ _movp(T, Src0RM);
+ _cmpps(T, LEGAL_HACK(Src1RM), Predicate);
+ } break;
+ case InstFcmp::One: {
+ // Check both unequal and ordered.
+ T = makeReg(Src0RM->getType());
+ Variable *T2 = makeReg(Src0RM->getType());
+ Src1RM = LEGAL_HACK(Src1RM);
+ _movp(T, Src0RM);
+ _cmpps(T, Src1RM, InstX8632Cmpps::Cmpps_neq);
+ _movp(T2, Src0RM);
+ _cmpps(T2, Src1RM, InstX8632Cmpps::Cmpps_ord);
+ _pand(T, T2);
+ } break;
+ case InstFcmp::Ueq: {
+ // Check both equal or unordered.
+ T = makeReg(Src0RM->getType());
+ Variable *T2 = makeReg(Src0RM->getType());
+ Src1RM = LEGAL_HACK(Src1RM);
+ _movp(T, Src0RM);
+ _cmpps(T, Src1RM, InstX8632Cmpps::Cmpps_eq);
+ _movp(T2, Src0RM);
+ _cmpps(T2, Src1RM, InstX8632Cmpps::Cmpps_unord);
+ _por(T, T2);
+ } break;
+ }
#undef LEGAL_HACK
+ }
_movp(Dest, T);
eliminateNextVectorSextInstruction(Dest);
@@ -2384,6 +2390,9 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
InstIcmp::ICond Condition = Inst->getCondition();
+ Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem);
+ Operand *Src1RM = legalize(Src1, Legal_Reg | Legal_Mem);
+
// SSE2 only has signed comparison operations. Transform unsigned
// inputs in a manner that allows for the use of signed comparison
// operations by flipping the high order bits.
@@ -2392,12 +2401,12 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
Variable *T0 = makeReg(Ty);
Variable *T1 = makeReg(Ty);
Variable *HighOrderBits = makeVectorOfHighOrderBits(Ty);
- _movp(T0, Src0);
+ _movp(T0, Src0RM);
_pxor(T0, HighOrderBits);
- _movp(T1, Src1);
+ _movp(T1, Src1RM);
_pxor(T1, HighOrderBits);
- Src0 = T0;
- Src1 = T1;
+ Src0RM = T0;
+ Src1RM = T1;
}
// TODO: ALIGNHACK: Both operands to compare instructions need to be
@@ -2410,38 +2419,38 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
llvm_unreachable("unexpected condition");
break;
case InstIcmp::Eq: {
- _movp(T, Src0);
- _pcmpeq(T, LEGAL_HACK(Src1));
+ _movp(T, Src0RM);
+ _pcmpeq(T, LEGAL_HACK(Src1RM));
} break;
case InstIcmp::Ne: {
- _movp(T, Src0);
- _pcmpeq(T, LEGAL_HACK(Src1));
+ _movp(T, Src0RM);
+ _pcmpeq(T, LEGAL_HACK(Src1RM));
Variable *MinusOne = makeVectorOfMinusOnes(Ty);
_pxor(T, MinusOne);
} break;
case InstIcmp::Ugt:
case InstIcmp::Sgt: {
- _movp(T, Src0);
- _pcmpgt(T, LEGAL_HACK(Src1));
+ _movp(T, Src0RM);
+ _pcmpgt(T, LEGAL_HACK(Src1RM));
} break;
case InstIcmp::Uge:
case InstIcmp::Sge: {
- // !(Src1 > Src0)
- _movp(T, Src1);
- _pcmpgt(T, LEGAL_HACK(Src0));
+ // !(Src1RM > Src0RM)
+ _movp(T, Src1RM);
+ _pcmpgt(T, LEGAL_HACK(Src0RM));
Variable *MinusOne = makeVectorOfMinusOnes(Ty);
_pxor(T, MinusOne);
} break;
case InstIcmp::Ult:
case InstIcmp::Slt: {
- _movp(T, Src1);
- _pcmpgt(T, LEGAL_HACK(Src0));
+ _movp(T, Src1RM);
+ _pcmpgt(T, LEGAL_HACK(Src0RM));
} break;
case InstIcmp::Ule:
case InstIcmp::Sle: {
- // !(Src0 > Src1)
- _movp(T, Src0);
- _pcmpgt(T, LEGAL_HACK(Src1));
+ // !(Src0RM > Src1RM)
+ _movp(T, Src0RM);
+ _pcmpgt(T, LEGAL_HACK(Src1RM));
Variable *MinusOne = makeVectorOfMinusOnes(Ty);
_pxor(T, MinusOne);
} break;
@@ -2533,16 +2542,16 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
}
void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) {
- Operand *SourceVectOperand = Inst->getSrc(0);
- Operand *ElementToInsert = Inst->getSrc(1);
+ Operand *SourceVectNotLegalized = Inst->getSrc(0);
+ Operand *ElementToInsertNotLegalized = Inst->getSrc(1);
ConstantInteger *ElementIndex =
llvm::dyn_cast<ConstantInteger>(Inst->getSrc(2));
// Only constant indices are allowed in PNaCl IR.
assert(ElementIndex);
unsigned Index = ElementIndex->getValue();
- assert(Index < typeNumElements(SourceVectOperand->getType()));
+ assert(Index < typeNumElements(SourceVectNotLegalized->getType()));
- Type Ty = SourceVectOperand->getType();
+ Type Ty = SourceVectNotLegalized->getType();
Type ElementTy = typeElementType(Ty);
Type InVectorElementTy = getInVectorElementType(Ty);
@@ -2551,39 +2560,45 @@ void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) {
// in the vector.
Variable *Expanded =
Func->makeVariable(InVectorElementTy, Context.getNode());
- InstCast *Cast =
- InstCast::create(Func, InstCast::Zext, Expanded, ElementToInsert);
+ InstCast *Cast = InstCast::create(Func, InstCast::Zext, Expanded,
+ ElementToInsertNotLegalized);
lowerCast(Cast);
- ElementToInsert = Expanded;
+ ElementToInsertNotLegalized = Expanded;
}
if (Ty == IceType_v8i16 || Ty == IceType_v8i1 || InstructionSet >= SSE4_1) {
// Use insertps, pinsrb, pinsrw, or pinsrd.
- Operand *Element = legalize(ElementToInsert, Legal_Mem | Legal_Reg);
+ Operand *ElementRM =
+ legalize(ElementToInsertNotLegalized, Legal_Reg | Legal_Mem);
+ Operand *SourceVectRM =
+ legalize(SourceVectNotLegalized, Legal_Reg | Legal_Mem);
Variable *T = makeReg(Ty);
- _movp(T, SourceVectOperand);
+ _movp(T, SourceVectRM);
if (Ty == IceType_v4f32)
- _insertps(T, Element, Ctx->getConstantInt(IceType_i8, Index << 4));
+ _insertps(T, ElementRM, Ctx->getConstantInt(IceType_i8, Index << 4));
else
- _pinsr(T, Element, Ctx->getConstantInt(IceType_i8, Index));
+ _pinsr(T, ElementRM, Ctx->getConstantInt(IceType_i8, Index));
_movp(Inst->getDest(), T);
} else if (Ty == IceType_v4i32 || Ty == IceType_v4f32 || Ty == IceType_v4i1) {
// Use shufps or movss.
- Variable *Element = NULL;
+ Variable *ElementR = NULL;
+ Operand *SourceVectRM =
+ legalize(SourceVectNotLegalized, Legal_Reg | Legal_Mem);
+
if (InVectorElementTy == IceType_f32) {
- // Element will be in an XMM register since it is floating point.
- Element = legalizeToVar(ElementToInsert);
+ // ElementR will be in an XMM register since it is floating point.
+ ElementR = legalizeToVar(ElementToInsertNotLegalized);
} else {
// Copy an integer to an XMM register.
- Operand *T = legalize(ElementToInsert, Legal_Reg | Legal_Mem);
- Element = makeReg(Ty);
- _movd(Element, T);
+ Operand *T = legalize(ElementToInsertNotLegalized, Legal_Reg | Legal_Mem);
+ ElementR = makeReg(Ty);
+ _movd(ElementR, T);
}
if (Index == 0) {
Variable *T = makeReg(Ty);
- _movp(T, SourceVectOperand);
- _movss(T, Element);
+ _movp(T, SourceVectRM);
+ _movss(T, ElementR);
_movp(Inst->getDest(), T);
return;
}
@@ -2597,19 +2612,19 @@ void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) {
// Element[0] is being inserted into SourceVectOperand. Indices are
// ordered from left to right.
//
- // insertelement into index 1 (result is stored in Element):
- // Element := Element[0, 0] SourceVectOperand[0, 0]
- // Element := Element[3, 0] SourceVectOperand[2, 3]
+ // insertelement into index 1 (result is stored in ElementR):
+ // ElementR := ElementR[0, 0] SourceVectRM[0, 0]
+ // ElementR := ElementR[3, 0] SourceVectRM[2, 3]
//
// insertelement into index 2 (result is stored in T):
- // T := SourceVectOperand
- // Element := Element[0, 0] T[0, 3]
- // T := T[0, 1] Element[0, 3]
+ // T := SourceVectRM
+ // ElementR := ElementR[0, 0] T[0, 3]
+ // T := T[0, 1] ElementR[0, 3]
//
// insertelement into index 3 (result is stored in T):
- // T := SourceVectOperand
- // Element := Element[0, 0] T[0, 2]
- // T := T[0, 1] Element[3, 0]
+ // T := SourceVectRM
+ // ElementR := ElementR[0, 0] T[0, 2]
+ // T := T[0, 1] ElementR[3, 0]
const unsigned char Mask1[3] = {0, 192, 128};
const unsigned char Mask2[3] = {227, 196, 52};
@@ -2621,15 +2636,15 @@ void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) {
// is implemented.
#define ALIGN_HACK(Vect) legalizeToVar((Vect))
if (Index == 1) {
- SourceVectOperand = ALIGN_HACK(SourceVectOperand);
- _shufps(Element, SourceVectOperand, Mask1Constant);
- _shufps(Element, SourceVectOperand, Mask2Constant);
- _movp(Inst->getDest(), Element);
+ SourceVectRM = ALIGN_HACK(SourceVectRM);
+ _shufps(ElementR, SourceVectRM, Mask1Constant);
+ _shufps(ElementR, SourceVectRM, Mask2Constant);
+ _movp(Inst->getDest(), ElementR);
} else {
Variable *T = makeReg(Ty);
- _movp(T, SourceVectOperand);
- _shufps(Element, T, Mask1Constant);
- _shufps(T, Element, Mask2Constant);
+ _movp(T, SourceVectRM);
+ _shufps(ElementR, T, Mask1Constant);
+ _shufps(T, ElementR, Mask2Constant);
_movp(Inst->getDest(), T);
}
#undef ALIGN_HACK
@@ -2638,17 +2653,17 @@ void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) {
// Spill the value to a stack slot and perform the insertion in
// memory.
//
- // TODO(wala): use legalize(SourceVectOperand, Legal_Mem) when
+ // TODO(wala): use legalize(SourceVectNotLegalized, Legal_Mem) when
// support for legalizing to mem is implemented.
Variable *Slot = Func->makeVariable(Ty, Context.getNode());
Slot->setWeight(RegWeight::Zero);
- _movp(Slot, legalizeToVar(SourceVectOperand));
+ _movp(Slot, legalizeToVar(SourceVectNotLegalized));
// Compute the location of the position to insert in memory.
unsigned Offset = Index * typeWidthInBytes(InVectorElementTy);
OperandX8632Mem *Loc =
getMemoryOperandForStackSlot(InVectorElementTy, Slot, Offset);
- _store(legalizeToVar(ElementToInsert), Loc);
+ _store(legalizeToVar(ElementToInsertNotLegalized), Loc);
Variable *T = makeReg(Ty);
_movp(T, Slot);
@@ -3573,6 +3588,8 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
if (isVectorType(Dest->getType())) {
Type SrcTy = SrcT->getType();
Variable *T = makeReg(SrcTy);
+ Operand *SrcTRM = legalize(SrcT, Legal_Reg | Legal_Mem);
+ Operand *SrcFRM = legalize(SrcF, Legal_Reg | Legal_Mem);
// ALIGNHACK: Until stack alignment support is implemented, vector
// instructions need to have vector operands in registers. Once
// there is support for stack alignment, LEGAL_HACK can be removed.
@@ -3584,11 +3601,12 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
// Use blendvps or pblendvb to implement select.
if (SrcTy == IceType_v4i1 || SrcTy == IceType_v4i32 ||
SrcTy == IceType_v4f32) {
+ Operand *ConditionRM = legalize(Condition, Legal_Reg | Legal_Mem);
Variable *xmm0 = makeReg(IceType_v4i32, Reg_xmm0);
- _movp(xmm0, Condition);
+ _movp(xmm0, ConditionRM);
_psll(xmm0, Ctx->getConstantInt(IceType_i8, 31));
- _movp(T, SrcF);
- _blendvps(T, LEGAL_HACK(SrcT), xmm0);
+ _movp(T, SrcFRM);
+ _blendvps(T, LEGAL_HACK(SrcTRM), xmm0);
_movp(Dest, T);
} else {
assert(typeNumElements(SrcTy) == 8 || typeNumElements(SrcTy) == 16);
@@ -3596,8 +3614,8 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
: IceType_v16i8;
Variable *xmm0 = makeReg(SignExtTy, Reg_xmm0);
lowerCast(InstCast::create(Func, InstCast::Sext, xmm0, Condition));
- _movp(T, SrcF);
- _pblendvb(T, LEGAL_HACK(SrcT), xmm0);
+ _movp(T, SrcFRM);
+ _pblendvb(T, LEGAL_HACK(SrcTRM), xmm0);
_movp(Dest, T);
}
return;
@@ -3617,11 +3635,12 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
} else if (typeElementType(SrcTy) != IceType_i1) {
lowerCast(InstCast::create(Func, InstCast::Sext, T, Condition));
} else {
- _movp(T, Condition);
+ Operand *ConditionRM = legalize(Condition, Legal_Reg | Legal_Mem);
+ _movp(T, ConditionRM);
}
_movp(T2, T);
- _pand(T, LEGAL_HACK(SrcT));
- _pandn(T2, LEGAL_HACK(SrcF));
+ _pand(T, LEGAL_HACK(SrcTRM));
+ _pandn(T2, LEGAL_HACK(SrcFRM));
_por(T, T2);
_movp(Dest, T);
#undef LEGAL_HACK
@@ -3947,6 +3966,10 @@ OperandX8632Mem *TargetX8632::FormMemoryOperand(Operand *Operand, Type Ty) {
Variable *Base = llvm::dyn_cast<Variable>(Operand);
Constant *Offset = llvm::dyn_cast<Constant>(Operand);
assert(Base || Offset);
+ if (Offset) {
+ assert(llvm::isa<ConstantInteger>(Offset) ||
+ llvm::isa<ConstantRelocatable>(Offset));
+ }
Mem = OperandX8632Mem::create(Func, Ty, Base, Offset);
}
return llvm::cast<OperandX8632Mem>(legalize(Mem));
@@ -4046,6 +4069,10 @@ template <> void ConstantDouble::emit(GlobalContext *Ctx) const {
Str << "qword ptr [L$" << IceType_f64 << "$" << getPoolEntryID() << "]";
}
+void ConstantUndef::emit(GlobalContext *) const {
+ llvm_unreachable("undef value encountered by emitter.");
+}
+
TargetGlobalInitX8632::TargetGlobalInitX8632(GlobalContext *Ctx)
: TargetGlobalInitLowering(Ctx) {}
« no previous file with comments | « src/IceOperand.h ('k') | tests_lit/llvm2ice_tests/regalloc_evict_non_overlap.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698