<html>
    <head>
      <base href="https://bugs.llvm.org/">
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW - bad and questionable codegen for inline asm returning a value in a fixed register"
   href="https://bugs.llvm.org/show_bug.cgi?id=47447">47447</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>bad and questionable codegen for inline asm returning a value in a fixed register
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Backend: RISC-V
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>sorear@fastmail.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>asb@lowrisc.org, llvm-bugs@lists.llvm.org
          </td>
        </tr></table>
      <p>
        <div>
        <pre>__builtin_thread_pointer() is not supported on released versions of risc-v gcc
or clang, so I looked for alternatives that would generate the same code.  I
tried:

void *get_tp() {
    register void *tp asm("tp");
    asm("" : "=r"(tp));
    return tp;
}

define i8* @get_tp() {
  %1 = tail call i8* asm "", "={x4}"()
  ret i8* %1
}

(<a href="https://gcc.godbolt.org/z/GP5ab4">https://gcc.godbolt.org/z/GP5ab4</a>)

This works fine on released gcc (can even fold into subsequent memory accesses
which become tp-relative) but llvm generates a superfluous stack frame as
though tp were a call-saved register.  Since tp is a fixed register, I don't
think llvm is _allowed_ to insert saves and restores for it; the asm might be
erroneous, I am not sure of the intended semantics, but if it is accepted it
should be accepted without generating a stack frame.</pre>
        </div>
      </p>


      <hr>
      <span>You are receiving this mail because:</span>

      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>