[llvm-commits] [llvm] r159388 - in /llvm/trunk: lib/VMCore/Verifier.cpp test/Verifier/invoke-1.ll test/Verifier/invoke-2.ll test/Verifier/invoke.ll
Duncan Sands
baldrick at free.fr
Fri Jun 29 08:59:27 PDT 2012
Hi Nuno,
>>> make the verifier accept @llvm.donothing as the only intrinsic that can be
>>> invoked
>>
>> are you interested in tweaking things so that invoke can safely be used with any
>> intrinsic? If not, please open a PR about it.
>
> Well, is there any real (or envisioned) usage for it? Right now all intrinsics
> are nounwind, as you pointed out before, so there's no point in allowing them in
> invokes. Unless you've something else in mind for the future?
the point is that it makes the IR more uniform by removing a special case. Yes,
invoke of intrinsic is useless, and would remain useless, but it wouldn't be
invalid any more.
Ciao, Duncan.
>
> Nuno
>
>
>> Thanks, Duncan.
>>
>>> While at it, merge 2 tests and FileCheckize them
>>>
>>> Added:
>>> llvm/trunk/test/Verifier/invoke.ll
>>> - copied, changed from r159385, llvm/trunk/test/Verifier/invoke-1.ll
>>> Removed:
>>> llvm/trunk/test/Verifier/invoke-1.ll
>>> llvm/trunk/test/Verifier/invoke-2.ll
>>> 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=159388&r1=159387&r2=159388&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/VMCore/Verifier.cpp (original)
>>> +++ llvm/trunk/lib/VMCore/Verifier.cpp Thu Jun 28 17:57:00 2012
>>> @@ -1636,9 +1636,11 @@
>>> if (Function *F = dyn_cast<Function>(I.getOperand(i))) {
>>> // Check to make sure that the "address of" an intrinsic function is
>>> never
>>> // taken.
>>> - CallSite CS(&I);
>>> - Assert1(!F->isIntrinsic() || (CS && i == (CS.isCall() ? e-1 : 2)),
>>> + Assert1(!F->isIntrinsic() || i == (isa<CallInst>(I) ? e-1 : 0),
>>> "Cannot take the address of an intrinsic!", &I);
>>> + Assert1(!F->isIntrinsic() || isa<CallInst>(I) ||
>>> + F->getIntrinsicID() == Intrinsic::donothing,
>>> + "Cannot invoke an intrinsinc other than donothing", &I);
>>> Assert1(F->getParent() == Mod, "Referencing function in another
>>> module!",
>>> &I);
>>> } else if (BasicBlock *OpBB = dyn_cast<BasicBlock>(I.getOperand(i))) {
>>>
>>> Removed: llvm/trunk/test/Verifier/invoke-1.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/invoke-1.ll?rev=159387&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Verifier/invoke-1.ll (original)
>>> +++ llvm/trunk/test/Verifier/invoke-1.ll (removed)
>>> @@ -1,10 +0,0 @@
>>> -; RUN: not llvm-as < %s |& grep {not verify as correct}
>>> -; PR1042
>>> -
>>> -define i32 @foo() {
>>> - %A = invoke i32 @foo( )
>>> - to label %L unwind label %L ; <i32> [#uses=1]
>>> -L: ; preds = %0, %0
>>> - ret i32 %A
>>> -}
>>> -
>>>
>>> Removed: llvm/trunk/test/Verifier/invoke-2.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/invoke-2.ll?rev=159387&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Verifier/invoke-2.ll (original)
>>> +++ llvm/trunk/test/Verifier/invoke-2.ll (removed)
>>> @@ -1,14 +0,0 @@
>>> -; RUN: not llvm-as %s |& grep {not verify as correct}
>>> -; PR1042
>>> -
>>> -define i32 @foo() {
>>> - br i1 false, label %L1, label %L2
>>> -L1: ; preds = %0
>>> - %A = invoke i32 @foo( )
>>> - to label %L unwind label %L ; <i32> [#uses=1]
>>> -L2: ; preds = %0
>>> - br label %L
>>> -L: ; preds = %L2, %L1, %L1
>>> - ret i32 %A
>>> -}
>>> -
>>>
>>> Copied: llvm/trunk/test/Verifier/invoke.ll (from r159385,
>>> llvm/trunk/test/Verifier/invoke-1.ll)
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/invoke.ll?p2=llvm/trunk/test/Verifier/invoke.ll&p1=llvm/trunk/test/Verifier/invoke-1.ll&r1=159385&r2=159388&rev=159388&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Verifier/invoke-1.ll (original)
>>> +++ llvm/trunk/test/Verifier/invoke.ll Thu Jun 28 17:57:00 2012
>>> @@ -1,10 +1,65 @@
>>> -; RUN: not llvm-as < %s |& grep {not verify as correct}
>>> -; PR1042
>>> +; RUN: not llvm-as < %s -o /dev/null |& FileCheck %s
>>>
>>> +; PR1042
>>> define i32 @foo() {
>>> +; CHECK: The unwind destination does not have a landingpad instruction
>>> %A = invoke i32 @foo( )
>>> to label %L unwind label %L ; <i32> [#uses=1]
>>> L: ; preds = %0, %0
>>> ret i32 %A
>>> }
>>>
>>> +; PR1042
>>> +define i32 @bar() {
>>> + br i1 false, label %L1, label %L2
>>> +L1: ; preds = %0
>>> + %A = invoke i32 @bar( )
>>> + to label %L unwind label %L ; <i32> [#uses=1]
>>> +L2: ; preds = %0
>>> + br label %L
>>> +L: ; preds = %L2, %L1, %L1
>>> +; CHECK: The unwind destination does not have a landingpad instruction
>>> +; CHECK: Instruction does not dominate all uses
>>> + ret i32 %A
>>> +}
>>> +
>>> +
>>> +declare i32 @__gxx_personality_v0(...)
>>> +declare void @llvm.donothing()
>>> +declare void @llvm.trap()
>>> +declare i8 @llvm.expect.i8(i8,i8)
>>> +declare i32 @fn(i8 (i8, i8)*)
>>> +
>>> +define void @f1() {
>>> +entry:
>>> +; OK
>>> + invoke void @llvm.donothing()
>>> + to label %cont unwind label %cont
>>> +
>>> +cont:
>>> + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>>> @__gxx_personality_v0 to i8*)
>>> + filter [0 x i8*] zeroinitializer
>>> + ret void
>>> +}
>>> +
>>> +define i8 @f2() {
>>> +entry:
>>> +; CHECK: Cannot invoke an intrinsinc other than donothing
>>> + invoke void @llvm.trap()
>>> + to label %cont unwind label %lpad
>>> +
>>> +cont:
>>> + ret i8 3
>>> +
>>> +lpad:
>>> + %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>>> @__gxx_personality_v0 to i8*)
>>> + filter [0 x i8*] zeroinitializer
>>> + ret i8 2
>>> +}
>>> +
>>> +define i32 @f3() {
>>> +entry:
>>> +; CHECK: Cannot take the address of an intrinsic
>>> + %call = call i32 @fn(i8 (i8, i8)* @llvm.expect.i8)
>>> + ret i32 %call
>>> +}
>>>
More information about the llvm-commits
mailing list