mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[SelectionDAG] Use llvm::Optional<APInt> for FoldValue.
Use llvm::Optional<APInt> instead of std::pair<APInt, bool> with the bool second being used to report success/failure of fold.
This commit is contained in:
parent
5cb8a60bd4
commit
45ccc05a7c
@ -4724,46 +4724,46 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
|
||||
return V;
|
||||
}
|
||||
|
||||
static std::pair<APInt, bool> FoldValue(unsigned Opcode, const APInt &C1,
|
||||
const APInt &C2) {
|
||||
static llvm::Optional<APInt> FoldValue(unsigned Opcode, const APInt &C1,
|
||||
const APInt &C2) {
|
||||
switch (Opcode) {
|
||||
case ISD::ADD: return std::make_pair(C1 + C2, true);
|
||||
case ISD::SUB: return std::make_pair(C1 - C2, true);
|
||||
case ISD::MUL: return std::make_pair(C1 * C2, true);
|
||||
case ISD::AND: return std::make_pair(C1 & C2, true);
|
||||
case ISD::OR: return std::make_pair(C1 | C2, true);
|
||||
case ISD::XOR: return std::make_pair(C1 ^ C2, true);
|
||||
case ISD::SHL: return std::make_pair(C1 << C2, true);
|
||||
case ISD::SRL: return std::make_pair(C1.lshr(C2), true);
|
||||
case ISD::SRA: return std::make_pair(C1.ashr(C2), true);
|
||||
case ISD::ROTL: return std::make_pair(C1.rotl(C2), true);
|
||||
case ISD::ROTR: return std::make_pair(C1.rotr(C2), true);
|
||||
case ISD::SMIN: return std::make_pair(C1.sle(C2) ? C1 : C2, true);
|
||||
case ISD::SMAX: return std::make_pair(C1.sge(C2) ? C1 : C2, true);
|
||||
case ISD::UMIN: return std::make_pair(C1.ule(C2) ? C1 : C2, true);
|
||||
case ISD::UMAX: return std::make_pair(C1.uge(C2) ? C1 : C2, true);
|
||||
case ISD::SADDSAT: return std::make_pair(C1.sadd_sat(C2), true);
|
||||
case ISD::UADDSAT: return std::make_pair(C1.uadd_sat(C2), true);
|
||||
case ISD::SSUBSAT: return std::make_pair(C1.ssub_sat(C2), true);
|
||||
case ISD::USUBSAT: return std::make_pair(C1.usub_sat(C2), true);
|
||||
case ISD::ADD: return C1 + C2;
|
||||
case ISD::SUB: return C1 - C2;
|
||||
case ISD::MUL: return C1 * C2;
|
||||
case ISD::AND: return C1 & C2;
|
||||
case ISD::OR: return C1 | C2;
|
||||
case ISD::XOR: return C1 ^ C2;
|
||||
case ISD::SHL: return C1 << C2;
|
||||
case ISD::SRL: return C1.lshr(C2);
|
||||
case ISD::SRA: return C1.ashr(C2);
|
||||
case ISD::ROTL: return C1.rotl(C2);
|
||||
case ISD::ROTR: return C1.rotr(C2);
|
||||
case ISD::SMIN: return C1.sle(C2) ? C1 : C2;
|
||||
case ISD::SMAX: return C1.sge(C2) ? C1 : C2;
|
||||
case ISD::UMIN: return C1.ule(C2) ? C1 : C2;
|
||||
case ISD::UMAX: return C1.uge(C2) ? C1 : C2;
|
||||
case ISD::SADDSAT: return C1.sadd_sat(C2);
|
||||
case ISD::UADDSAT: return C1.uadd_sat(C2);
|
||||
case ISD::SSUBSAT: return C1.ssub_sat(C2);
|
||||
case ISD::USUBSAT: return C1.usub_sat(C2);
|
||||
case ISD::UDIV:
|
||||
if (!C2.getBoolValue())
|
||||
break;
|
||||
return std::make_pair(C1.udiv(C2), true);
|
||||
return C1.udiv(C2);
|
||||
case ISD::UREM:
|
||||
if (!C2.getBoolValue())
|
||||
break;
|
||||
return std::make_pair(C1.urem(C2), true);
|
||||
return C1.urem(C2);
|
||||
case ISD::SDIV:
|
||||
if (!C2.getBoolValue())
|
||||
break;
|
||||
return std::make_pair(C1.sdiv(C2), true);
|
||||
return C1.sdiv(C2);
|
||||
case ISD::SREM:
|
||||
if (!C2.getBoolValue())
|
||||
break;
|
||||
return std::make_pair(C1.srem(C2), true);
|
||||
return C1.srem(C2);
|
||||
}
|
||||
return std::make_pair(APInt(1, 0), false);
|
||||
return llvm::None;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
|
||||
@ -4771,12 +4771,10 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
|
||||
const ConstantSDNode *C2) {
|
||||
if (C1->isOpaque() || C2->isOpaque())
|
||||
return SDValue();
|
||||
|
||||
std::pair<APInt, bool> Folded = FoldValue(Opcode, C1->getAPIntValue(),
|
||||
C2->getAPIntValue());
|
||||
if (!Folded.second)
|
||||
return SDValue();
|
||||
return getConstant(Folded.first, DL, VT);
|
||||
if (Optional<APInt> Folded =
|
||||
FoldValue(Opcode, C1->getAPIntValue(), C2->getAPIntValue()))
|
||||
return getConstant(Folded.getValue(), DL, VT);
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::FoldSymbolOffset(unsigned Opcode, EVT VT,
|
||||
|
Loading…
Reference in New Issue
Block a user