<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Hack Nerd Font Mono">Because in the first case the
        GEP is an instruction and in the second case a Constant.</font></p>
    <p><font face="Hack Nerd Font Mono">We have helpers, like
        GEPOperand, to handle both the same way.<br>
      </font></p>
    <p><font face="Hack Nerd Font Mono"></font><br>
    </p>
    <div class="moz-cite-prefix">On 6/13/20 10:29 AM, James
      Courtier-Dutton wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAAMvbhF29EXfEay8owsGN1cskSRGdMcDyuN7c5zV5=Sug2gFFA@mail.gmail.com">
      <pre class="moz-quote-pre" wrap="">Hi,

What I meant was, why is it not represented by something like this instead:

define dso_local i32 @test21() #0 {
  %1 = i8* getelementptr inbounds ([8 x
i8], [8 x i8]* @.str, i64 0, i64 0)
  %2 = call i32 (i8*, ...) @printf(%1)
  ret i32 0
}

instead of:

define dso_local i32 @test21() #0 {
  %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x
i8], [8 x i8]* @.str, i64 0, i64 0))
  ret i32 0
}

Some code I am writing would be a lot simpler if the first case was used.


On Sun, 31 May 2020 at 16:56, Johannes Doerfert
<a class="moz-txt-link-rfc2396E" href="mailto:johannesdoerfert@gmail.com"><johannesdoerfert@gmail.com></a> wrote:
</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">
Hi James,


Like other constant expressions, e.g., i32 0, this GEP constant

expression are "shown" inlined. Constants are unique and exist

everywhere. I guess the most "important' use case I can think

of is to use such GEPs as part of other constant expressions,

e.g., initializers of constant globals.


Cheers,

  Johannes


On 5/31/20 3:49 AM, James Courtier-Dutton via llvm-dev wrote:

Hi,

Why is the getelementptr part of the call instruction, instead of
being a separate instruction in the LLVM IR ?
The LLVM IR Builder adds it as a separate instruction, but it is
rolled into one call instruction in the .bc output.
I am just curious as to why it is done this way.

#include <stdint.h>
#include <stdio.h>
int test21(void);
int test21(void) {
        printf("Hello1\n");
        return 0;
}

define dso_local i32 @test21() #0 {
  %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x
i8], [8 x i8]* @.str, i64 0, i64 0))
  ret i32 0
}
_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
      </blockquote>
    </blockquote>
  </body>
</html>