mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 19:12:56 +02:00
Fix creating illegal setcc cond codes.
If GT/UGT or LT/ULT were set to expand, a comparison with a constant would replace it with the illegal cond code. There are several more places later in this function that will have the same basic problem. Theoretically R600 should hit this problem for a test, but for some reason it doesn't. llvm-svn: 204727
This commit is contained in:
parent
c4006bcb3e
commit
1772c4217d
@ -1470,24 +1470,32 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
// Canonicalize GE/LE comparisons to use GT/LT comparisons.
|
||||
if (Cond == ISD::SETGE || Cond == ISD::SETUGE) {
|
||||
if (C1 == MinVal) return DAG.getConstant(1, VT); // X >= MIN --> true
|
||||
// X >= C0 --> X > (C0-1)
|
||||
APInt C = C1-1;
|
||||
if (!N1C->isOpaque() || (N1C->isOpaque() && C.getBitWidth() <= 64 &&
|
||||
isLegalICmpImmediate(C.getSExtValue())))
|
||||
// X >= C0 --> X > (C0 - 1)
|
||||
APInt C = C1 - 1;
|
||||
ISD::CondCode NewCC = (Cond == ISD::SETGE) ? ISD::SETGT : ISD::SETUGT;
|
||||
if ((DCI.isBeforeLegalizeOps() ||
|
||||
isCondCodeLegal(NewCC, VT.getSimpleVT())) &&
|
||||
(!N1C->isOpaque() || (N1C->isOpaque() && C.getBitWidth() <= 64 &&
|
||||
isLegalICmpImmediate(C.getSExtValue())))) {
|
||||
return DAG.getSetCC(dl, VT, N0,
|
||||
DAG.getConstant(C, N1.getValueType()),
|
||||
(Cond == ISD::SETGE) ? ISD::SETGT : ISD::SETUGT);
|
||||
NewCC);
|
||||
}
|
||||
}
|
||||
|
||||
if (Cond == ISD::SETLE || Cond == ISD::SETULE) {
|
||||
if (C1 == MaxVal) return DAG.getConstant(1, VT); // X <= MAX --> true
|
||||
// X <= C0 --> X < (C0+1)
|
||||
APInt C = C1+1;
|
||||
if (!N1C->isOpaque() || (N1C->isOpaque() && C.getBitWidth() <= 64 &&
|
||||
isLegalICmpImmediate(C.getSExtValue())))
|
||||
// X <= C0 --> X < (C0 + 1)
|
||||
APInt C = C1 + 1;
|
||||
ISD::CondCode NewCC = (Cond == ISD::SETLE) ? ISD::SETLT : ISD::SETULT;
|
||||
if ((DCI.isBeforeLegalizeOps() ||
|
||||
isCondCodeLegal(NewCC, VT.getSimpleVT())) &&
|
||||
(!N1C->isOpaque() || (N1C->isOpaque() && C.getBitWidth() <= 64 &&
|
||||
isLegalICmpImmediate(C.getSExtValue())))) {
|
||||
return DAG.getSetCC(dl, VT, N0,
|
||||
DAG.getConstant(C, N1.getValueType()),
|
||||
(Cond == ISD::SETLE) ? ISD::SETLT : ISD::SETULT);
|
||||
NewCC);
|
||||
}
|
||||
}
|
||||
|
||||
if ((Cond == ISD::SETLT || Cond == ISD::SETULT) && C1 == MinVal)
|
||||
|
Loading…
Reference in New Issue
Block a user