[llvm-commits] [llvm] r96282 - in /llvm/trunk: lib/VMCore/Verifier.cpp unittests/VMCore/VerifierTest.cpp
Nick Lewycky
nicholas at mxc.ca
Mon Feb 15 16:42:08 PST 2010
Chris Lattner wrote:
> Isn't a unit test for this completely overkill?
Testing methodology-type people would tell you that the real problem is
that the rest of the verifier is lacking tests ...
... but really, writing this test case is what led to the fixes in
r96272, r96273 and r96275. Even if we didn't test this in particular, we
should probably have a unit test that F->dump() and FPM.run(F) on
functions that have no module owners still work.
Ultimately I don't really care.
Nick
>
> -Chris
>
> On Feb 15, 2010, at 2:09 PM, Nick Lewycky wrote:
>
>> Author: nicholas
>> Date: Mon Feb 15 16:09:09 2010
>> New Revision: 96282
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=96282&view=rev
>> Log:
>> Teach the verifier to check the condition on a branch and ensure that it has
>> 'i1' type.
>>
>> Added:
>> llvm/trunk/unittests/VMCore/VerifierTest.cpp
>> Modified:
>> llvm/trunk/lib/VMCore/Verifier.cpp
>>
>> Modified: llvm/trunk/lib/VMCore/Verifier.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Verifier.cpp?rev=96282&r1=96281&r2=96282&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/VMCore/Verifier.cpp (original)
>> +++ llvm/trunk/lib/VMCore/Verifier.cpp Mon Feb 15 16:09:09 2010
>> @@ -317,6 +317,7 @@
>> void visitStoreInst(StoreInst&SI);
>> void visitInstruction(Instruction&I);
>> void visitTerminatorInst(TerminatorInst&I);
>> + void visitBranchInst(BranchInst&BI);
>> void visitReturnInst(ReturnInst&RI);
>> void visitSwitchInst(SwitchInst&SI);
>> void visitSelectInst(SelectInst&SI);
>> @@ -749,6 +750,14 @@
>> visitInstruction(I);
>> }
>>
>> +void Verifier::visitBranchInst(BranchInst&BI) {
>> + if (BI.isConditional()) {
>> + Assert2(BI.getCondition()->getType()->isIntegerTy(1),
>> + "Branch condition is not 'i1' type!",&BI, BI.getCondition());
>> + }
>> + visitTerminatorInst(BI);
>> +}
>> +
>> void Verifier::visitReturnInst(ReturnInst&RI) {
>> Function *F = RI.getParent()->getParent();
>> unsigned N = RI.getNumOperands();
>>
>> Added: llvm/trunk/unittests/VMCore/VerifierTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/VMCore/VerifierTest.cpp?rev=96282&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/unittests/VMCore/VerifierTest.cpp (added)
>> +++ llvm/trunk/unittests/VMCore/VerifierTest.cpp Mon Feb 15 16:09:09 2010
>> @@ -0,0 +1,44 @@
>> +//===- llvm/unittest/VMCore/VerifierTest.cpp - Verifier unit tests --------===//
>> +//
>> +// The LLVM Compiler Infrastructure
>> +//
>> +// This file is distributed under the University of Illinois Open Source
>> +// License. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "llvm/Constants.h"
>> +#include "llvm/DerivedTypes.h"
>> +#include "llvm/Function.h"
>> +#include "llvm/Instructions.h"
>> +#include "llvm/LLVMContext.h"
>> +#include "llvm/Analysis/Verifier.h"
>> +#include "gtest/gtest.h"
>> +
>> +namespace llvm {
>> +namespace {
>> +
>> +TEST(VerifierTest, Branch_i1) {
>> + LLVMContext&C = getGlobalContext();
>> + FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), /*isVarArg=*/false);
>> + Function *F = Function::Create(FTy, GlobalValue::ExternalLinkage);
>> + BasicBlock *Entry = BasicBlock::Create(C, "entry", F);
>> + BasicBlock *Exit = BasicBlock::Create(C, "exit", F);
>> + ReturnInst::Create(C, Exit);
>> +
>> + // To avoid triggering an assertion in BranchInst::Create, we first create
>> + // a branch with an 'i1' condition ...
>> +
>> + Constant *False = ConstantInt::getFalse(C);
>> + BranchInst *BI = BranchInst::Create(Exit, Exit, False, Entry);
>> +
>> + // ... then use setOperand to redirect it to a value of different type.
>> +
>> + Constant *Zero32 = ConstantInt::get(IntegerType::get(C, 32), 0);
>> + BI->setOperand(0, Zero32);
>> +
>> + EXPECT_TRUE(verifyFunction(*F, ReturnStatusAction));
>> +}
>> +
>> +}
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
More information about the llvm-commits
mailing list