[IR] Add Freeze instruction
Summary: - Define Instruction::Freeze, let it be UnaryOperator - Add support for freeze to LLLexer/LLParser/BitcodeReader/BitcodeWriter The format is `%x = freeze <ty> %v` - Add support for freeze instruction to llvm-c interface. - Add m_Freeze in PatternMatch. - Erase freeze when lowering IR to SelDag. Reviewers: deadalnix, hfinkel, efriedma, lebedev.ri, nlopes, jdoerfert, regehr, filcab, delcypher, whitequark Reviewed By: lebedev.ri, jdoerfert Subscribers: jfb, kristof.beyls, hiraditya, lebedev.ri, steven_wu, dexonsmith, xbolva00, delcypher, spatel, regehr, trentxintong, vsk, filcab, nlopes, mehdi_amini, deadalnix, llvm-commits Differential Revision: https://reviews.llvm.org/D29011
This commit is contained in:
@@ -521,6 +521,7 @@ static unsigned getEncodedUnaryOpcode(unsigned Opcode) {
|
||||
switch (Opcode) {
|
||||
default: llvm_unreachable("Unknown binary instruction!");
|
||||
case Instruction::FNeg: return bitc::UNOP_FNEG;
|
||||
case Instruction::Freeze: return bitc::UNOP_FREEZE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2433,6 +2434,17 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,
|
||||
Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));
|
||||
Record.push_back(VE.getValueID(C->getOperand(0)));
|
||||
AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
|
||||
} else if (Instruction::isUnaryOp(CE->getOpcode())) {
|
||||
assert(CE->getNumOperands() == 1 && "Unknown constant expr!");
|
||||
Code = bitc::CST_CODE_CE_UNOP;
|
||||
Record.push_back(getEncodedUnaryOpcode(CE->getOpcode()));
|
||||
Record.push_back(VE.getValueID(C->getOperand(0)));
|
||||
uint64_t Flags = getOptimizationFlags(CE);
|
||||
if (Flags != 0) {
|
||||
assert(CE->getOpcode() == Instruction::FNeg);
|
||||
Record.push_back(Flags);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
assert(CE->getNumOperands() == 2 && "Unknown constant expr!");
|
||||
Code = bitc::CST_CODE_CE_BINOP;
|
||||
@@ -2444,16 +2456,6 @@ void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,
|
||||
Record.push_back(Flags);
|
||||
}
|
||||
break;
|
||||
case Instruction::FNeg: {
|
||||
assert(CE->getNumOperands() == 1 && "Unknown constant expr!");
|
||||
Code = bitc::CST_CODE_CE_UNOP;
|
||||
Record.push_back(getEncodedUnaryOpcode(CE->getOpcode()));
|
||||
Record.push_back(VE.getValueID(C->getOperand(0)));
|
||||
uint64_t Flags = getOptimizationFlags(CE);
|
||||
if (Flags != 0)
|
||||
Record.push_back(Flags);
|
||||
break;
|
||||
}
|
||||
case Instruction::GetElementPtr: {
|
||||
Code = bitc::CST_CODE_CE_GEP;
|
||||
const auto *GO = cast<GEPOperator>(C);
|
||||
@@ -2611,6 +2613,17 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I,
|
||||
AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
|
||||
Vals.push_back(VE.getTypeID(I.getType()));
|
||||
Vals.push_back(getEncodedCastOpcode(I.getOpcode()));
|
||||
} else if (isa<UnaryOperator>(I)) {
|
||||
Code = bitc::FUNC_CODE_INST_UNOP;
|
||||
if (!pushValueAndType(I.getOperand(0), InstID, Vals))
|
||||
AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
|
||||
Vals.push_back(getEncodedUnaryOpcode(I.getOpcode()));
|
||||
uint64_t Flags = getOptimizationFlags(&I);
|
||||
if (Flags != 0) {
|
||||
if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
|
||||
AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
|
||||
Vals.push_back(Flags);
|
||||
}
|
||||
} else {
|
||||
assert(isa<BinaryOperator>(I) && "Unknown instruction!");
|
||||
Code = bitc::FUNC_CODE_INST_BINOP;
|
||||
@@ -2626,19 +2639,6 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I,
|
||||
}
|
||||
}
|
||||
break;
|
||||
case Instruction::FNeg: {
|
||||
Code = bitc::FUNC_CODE_INST_UNOP;
|
||||
if (!pushValueAndType(I.getOperand(0), InstID, Vals))
|
||||
AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
|
||||
Vals.push_back(getEncodedUnaryOpcode(I.getOpcode()));
|
||||
uint64_t Flags = getOptimizationFlags(&I);
|
||||
if (Flags != 0) {
|
||||
if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
|
||||
AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
|
||||
Vals.push_back(Flags);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Instruction::GetElementPtr: {
|
||||
Code = bitc::FUNC_CODE_INST_GEP;
|
||||
AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
|
||||
|
||||
Reference in New Issue
Block a user