<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">On 01/20/2014 02:51 PM, Brandon Holt
      wrote:<br>
    </div>
    <blockquote
      cite="mid:4B51F3E8-6ED6-43DF-ACF6-E6C65E29E600@cs.washington.edu"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=ISO-8859-1">
      I’ve been developing an optimization pass that uses the address
      space attribute (__attribute__((address_space(200))) to indicate
      different kinds of pointers to be treated differently (I’m making
      them be pointers to a “global” address space as in UPC).
      <div><br>
      </div>
      <div>However, I’ve hit a snag in the frontend code generator: if I
        try to make a method call on a pointer with a custom address
        space, the frontend chokes because it can’t bitcast between
        different address spaces, and methods are functions that take a
        pointer to “this” which is assumed to be in addrspace(0):</div>
      <div><br>
      </div>
      <div>
        <blockquote type="cite">
          <div style="font-size: 11px;"><font face="Inconsolata LGC">Assertion
              failed: (castIsValid(op, S, Ty) && "Invalid
              cast!"), function Create, file ../lib/IR/Instructions.cpp,
              line 2352.</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">0
               clang-3.4                0x00000001039527f8
              llvm::sys::PrintStackTrace(__sFILE*) + 40</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">1
               clang-3.4                0x0000000103952c54
              SignalHandler(int) + 388</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">2
               libsystem_platform.dylib 0x00007fff802395aa _sigtramp +
              26</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">3
               libsystem_platform.dylib 000000000000000000 _sigtramp +
              2145151600</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">4
               clang-3.4                0x0000000103952ab6 abort + 22</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">5
               clang-3.4                0x0000000103952a91 __assert_rtn
              + 81</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">6
               clang-3.4                0x000000010385f8bf
              llvm::CastInst::Create(llvm::Instruction::CastOps,
              llvm::Value*, llvm::Type*, llvm::Twine const&,
              llvm::Instruction*) + 687</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">7
               clang-3.4                0x00000001030a4d1c
              llvm::IRBuilder<true, llvm::ConstantFolder,
              llvm::IRBuilderDefaultInserter<true>
              >::CreateCast(llvm::Instruction::CastOps, llvm::Value*,
              llvm::Type*, llvm::Twine const&) + 76</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">8
               clang-3.4                0x0000000103bbeac3
              clang::CodeGen::CodeGenFunction::EmitCall(clang::CodeGen::CGFunctionInfo
              const&, llvm::Value*, clang::CodeGen::ReturnValueSlot,
              clang::CodeGen::CallArgList const&, clang::Decl
              const*, llvm::Instruction**) + 3075</font></div>
          <div style="font-size: 11px;"><font face="Inconsolata LGC">9
               clang-3.4                0x0000000103c11c02
              clang::CodeGen::CodeGenFunction::EmitCXXMemberCall(clang::CXXMethodDecl
              const*, clang::SourceLocation, llvm::Value*,
              clang::CodeGen::ReturnValueSlot, llvm::Value*,
              llvm::Value*, clang::QualType, clang::ConstExprIterator,
              clang::ConstExprIterator) + 738</font></div>
        </blockquote>
      </div>
      <div><br>
      </div>
      <div>I know it is not actually expected to be correct behavior to
        use other addrspace pointers in place of addrspace(0) pointers.
        My transformation passes change these calls, but I don’t get a
        chance to make the change because the frontend chokes first.</div>
      <div><br>
      </div>
      <div>My questions are:</div>
      <div>1. Is there a more graceful way that these bitcasts could be
        handled? Code to load/store from alternate address spaces is
        allowed to be generated, it just segfaults when run. Can the
        same behavior be allowed without breaking things for method
        calls to these pointers? I can imagine simply adding code to
        detect if the address space is wrong and applying an addrspace
        cast to get around it.</div>
    </blockquote>
    Since 3.4 you need to use the addrspacecast instruction to cast
    between address spaces. It's possible there are still some places
    left that haven't been fixed yet to use it instead of creating
    bitcasts.<br>
    <br>
    <blockquote
      cite="mid:4B51F3E8-6ED6-43DF-ACF6-E6C65E29E600@cs.washington.edu"
      type="cite">
      <div><br>
      </div>
      <div>2. Is there a way to create methods that can be called with
        pointers to different address spaces? It seems there is no way
        to declare these in C++ using GNU attributes, and addrspace()
        seems to not be supported by C++11 attribute syntax, which could
        possibly express this.</div>
    </blockquote>
    You can use __attribute__((address_space(N))<br>
    <br>
    <blockquote
      cite="mid:4B51F3E8-6ED6-43DF-ACF6-E6C65E29E600@cs.washington.edu"
      type="cite">
      <div><br>
      </div>
      <div>Thanks,</div>
      <div>-Brandon</div>
      <div><br>
      </div>
      <div>--</div>
      <div>Brandon Holt</div>
      <div>Grad student @ University of Washington</div>
      <div><a moz-do-not-send="true"
          href="http://homes.cs.washington.edu/%7Ebholt">http://homes.cs.washington.edu/~bholt</a></div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a class="moz-txt-link-freetext" href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>