[IR] Redefine Freeze instruction
Summary: This patch redefines freeze instruction from being UnaryOperator to a subclass of UnaryInstruction. ConstantExpr freeze is removed, as discussed in the previous review. FreezeOperator is not added because there's no ConstantExpr freeze. `freeze i8* null` test is added to `test/Bindings/llvm-c/freeze.ll` as well, because the null pointer-related bug in `tools/llvm-c/echo.cpp` is now fixed. InstVisitor has visitFreeze now because freeze is not unaryop anymore. Reviewers: whitequark, deadalnix, craig.topper, jdoerfert, lebedev.ri Reviewed By: craig.topper, lebedev.ri Subscribers: regehr, nlopes, mehdi_amini, hiraditya, steven_wu, dexonsmith, jfb, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D69932
This commit is contained in:
@@ -1056,13 +1056,16 @@ static int getDecodedCastOpcode(unsigned Val) {
|
||||
}
|
||||
|
||||
static int getDecodedUnaryOpcode(unsigned Val, Type *Ty) {
|
||||
bool IsFP = Ty->isFPOrFPVectorTy();
|
||||
// UnOps are only valid for int/fp or vector of int/fp types
|
||||
if (!IsFP && !Ty->isIntOrIntVectorTy())
|
||||
return -1;
|
||||
|
||||
switch (Val) {
|
||||
default:
|
||||
return -1;
|
||||
case bitc::UNOP_FNEG:
|
||||
return Ty->isFPOrFPVectorTy() ? Instruction::FNeg : -1;
|
||||
case bitc::UNOP_FREEZE:
|
||||
return Instruction::Freeze;
|
||||
return IsFP ? Instruction::FNeg : -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3863,7 +3866,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
case bitc::FUNC_CODE_INST_UNOP: { // UNOP: [opval, ty, opcode]
|
||||
unsigned OpNum = 0;
|
||||
Value *LHS;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, LHS, &FullTy) ||
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, LHS) ||
|
||||
OpNum+1 > Record.size())
|
||||
return error("Invalid record");
|
||||
|
||||
@@ -5116,6 +5119,19 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
|
||||
OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
|
||||
continue;
|
||||
}
|
||||
|
||||
case bitc::FUNC_CODE_INST_FREEZE: { // FREEZE: [opty,opval]
|
||||
unsigned OpNum = 0;
|
||||
Value *Op = nullptr;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Op, &FullTy))
|
||||
return error("Invalid record");
|
||||
if (OpNum != Record.size())
|
||||
return error("Invalid record");
|
||||
|
||||
I = new FreezeInst(Op);
|
||||
InstructionList.push_back(I);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add instruction to end of current BB. If there is no current BB, reject
|
||||
|
||||
Reference in New Issue
Block a user