[LLVMdev] GEP instruction change

Eli Friedman eli.friedman at gmail.com
Fri Aug 21 03:33:54 PDT 2009


On Fri, Aug 21, 2009 at 2:02 AM, Artur Pietrek<pietreka at gmail.com> wrote:
> Hi All,
> Since few days I observe weird change.
> Consider the following C code
>
> char array[] = "0123456789";
> extern int test(char arr[], int size);
>
> int main(void) {
>   return test(array-1, sizeof(array)-1);
> }
>
> using clang frontend i get this:
>
> %call = call i32 @test(i8* getelementptr inbounds ([11 x i8]* @array, i32 0,
> i32 -1), i32 10) ; <i32> [#uses=1]
>
> and using LLVM-GCC this:
> %1 = call i32 @test(i8* getelementptr ([11 x i8]* @array, i32 1561806289,
> i32 4), i32 10) nounwind ; <i32> [#uses=1]
>
> Should the second getelementptr look like this? Is it correct or a bug?

Indexing out of an array is undefined behavior per C99, but that
particular result does look strange...

> Since that change there's a problem in MSIL backend - it simply triggers
> pointer overflow assertion.

Sorry, I don't know anything about the MSIL backend.

-Eli




More information about the llvm-dev mailing list