[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

Nuno Lopes nunoplopes at sapo.pt
Fri Jun 29 08:49:34 PDT 2012


Quoting Duncan Sands <baldrick at free.fr>:

> 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?

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