[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