forked from OSchip/llvm-project
LegalizeDAG: make sure cast is unsigned before using FP_TO_UINT.
It's valid to use FP_TO_SINT when asking for a smaller type (e.g. all "unsigned int16" values fit into a "signed int32"), but the reverse isn't true. Unfortunately, I'm not actually aware of any architecture with asymmetric FP_TO_SINT and FP_TO_UINT handling and the logic happens to work in the symmetric case, so I can't actually write a test for this. llvm-svn: 210986
This commit is contained in:
parent
dbecc3b3fc
commit
65277a2bc0
|
@ -2650,12 +2650,15 @@ SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp,
|
|||
NewOutTy = (MVT::SimpleValueType)(NewOutTy.getSimpleVT().SimpleTy+1);
|
||||
assert(NewOutTy.isInteger() && "Ran out of possibilities!");
|
||||
|
||||
// A larger signed type can hold all unsigned values of the requested type,
|
||||
// so using FP_TO_SINT is valid
|
||||
if (TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NewOutTy)) {
|
||||
OpToUse = ISD::FP_TO_SINT;
|
||||
break;
|
||||
}
|
||||
|
||||
if (TLI.isOperationLegalOrCustom(ISD::FP_TO_UINT, NewOutTy)) {
|
||||
// However, if the value may be < 0.0, we *must* use some FP_TO_SINT.
|
||||
if (!isSigned && TLI.isOperationLegalOrCustom(ISD::FP_TO_UINT, NewOutTy)) {
|
||||
OpToUse = ISD::FP_TO_UINT;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue