mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-04 02:24:29 +00:00
Sign-extend rather than zero-extend when promoting
the condition for a BRCOND, according to what is returned by getSetCCResultContents. Since all targets return the same thing (ZeroOrOneSetCCResult), this should be harmless! The point is that all over the place the result of SETCC is fed directly into BRCOND. On machines for which getSetCCResultContents returns ZeroOrNegativeOneSetCCResult, this is a sign-extended boolean. So it seems dangerous to also feed BRCOND zero-extended booleans in some circumstances - for example, when promoting the condition. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58861 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -696,12 +696,25 @@ SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) {
|
||||
assert(OpNo == 1 && "only know how to promote condition");
|
||||
SDValue Cond = GetPromotedInteger(N->getOperand(1)); // Promote condition.
|
||||
|
||||
// The top bits of the promoted condition are not necessarily zero, ensure
|
||||
// that the value is properly zero extended.
|
||||
unsigned BitWidth = Cond.getValueSizeInBits();
|
||||
if (!DAG.MaskedValueIsZero(Cond,
|
||||
APInt::getHighBitsSet(BitWidth, BitWidth-1)))
|
||||
Cond = DAG.getZeroExtendInReg(Cond, MVT::i1);
|
||||
// Make sure the extra bits coming from type promotion conform to
|
||||
// getSetCCResultContents.
|
||||
unsigned CondBits = Cond.getValueSizeInBits();
|
||||
switch (TLI.getSetCCResultContents()) {
|
||||
default:
|
||||
assert(false && "Unknown SetCCResultValue!");
|
||||
case TargetLowering::UndefinedSetCCResult:
|
||||
// The promoted value, which may contain rubbish in the upper bits, is fine.
|
||||
break;
|
||||
case TargetLowering::ZeroOrOneSetCCResult:
|
||||
if (!DAG.MaskedValueIsZero(Cond,APInt::getHighBitsSet(CondBits,CondBits-1)))
|
||||
Cond = DAG.getZeroExtendInReg(Cond, MVT::i1);
|
||||
break;
|
||||
case TargetLowering::ZeroOrNegativeOneSetCCResult:
|
||||
if (DAG.ComputeNumSignBits(Cond) != CondBits)
|
||||
Cond = DAG.getNode(ISD::SIGN_EXTEND_INREG, Cond.getValueType(), Cond,
|
||||
DAG.getValueType(MVT::i1));
|
||||
break;
|
||||
}
|
||||
|
||||
// The chain (Op#0) and basic block destination (Op#2) are always legal types.
|
||||
return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0), Cond,
|
||||
|
Reference in New Issue
Block a user