[LLVMdev] Should the function operand flag 'sret' match the flag in function declaration?

Chris Lattner clattner at apple.com
Sat May 8 10:31:44 PDT 2010


On May 7, 2010, at 6:24 PM, Yuri wrote:

> I have these two instructions, first one inside some procedure, second 
> one is an outside declaration.
> Code verification passes and it runs, but incorrectly.

Right, this code has undefined behavior.

> Every time I saw such situation coming from c++ compiler, attributes 
> 'noalias sret' appear on both call and declaration.
> 
> Does such situation make sense, or (as I guess it is) a bug in verifier? 
> I think verifier should match at least 'sret' flag in call and declaration.
> 
> ...
> call void @_Z7returnsi(%struct.MyString* %z, i32 %1) nounwind
> ...
> declare void @_Z7returnsi(%struct.MyString* noalias sret, i32)
> ...

The verifier flags and rejects *invalid* IR, not IR with undefined behavior.  Dan has been working on a pass (in lib/Analysis/Lint.cpp) that should catch this sort of thing.  If it doesn't already, please send in a patch to make it catch it.  Thanks!

-Chris



More information about the llvm-dev mailing list