I don’t have the IR handy. You can easily generate it for yourself though. Just 
drop the following into any file (I use swift/lib/AST/Type.cpp) and recompile 
swift.

Decl *my_test_function(Type t) {
  return t->getClassOrBoundGenericClass();
}


> On Jan 1, 2018, at 12:53, Michael Gottesman <mgottes...@apple.com> wrote:
> 
> Do you have the llvm-ir handy?
> 
>> On Jan 1, 2018, at 11:30 AM, David Zarzycki via swift-dev 
>> <swift-dev@swift.org> wrote:
>> 
>> Hello,
>> 
>> I noticed recently that the code gen of 
>> CanType::getClassOrBoundGenericClass() could be better and along the way I 
>> found a clang/LLVM bug. Where exactly, I do not know, although my bet is the 
>> LLVM optimizer.
>> 
>> When more than one dyn_cast() happens in a row, LLVM/clang emits redundant 
>> and pointless nullptr checks. Both Apple clang-900.0.39.2 and clang/llvm 
>> top-of-tree generate essentially the same code:
>> 
>> <+35>: movb   0x8(%rbx), %cl  ; getKind()
>> <+38>: testq  %rbx, %rbx      ; XXX - nullptr check after deref is pointless
>> <+41>: je     0x1377df6       ; <+54>
>> <+43>: cmpb   $0x12, %cl      ; isa<ClassType>()
>> <+46>: jne    0x1377df6       ; <+54>
>> <+48>: addq   $0x10, %rbx     ; (void*)this + offsetof(ClassType, TheDecl)
>> <+52>: jmp    0x1377e06       ; <+70>
>> <+54>: xorl   %eax, %eax      ; the default return value (nullptr)
>> <+56>: testq  %rbx, %rbx      ; XXX - another pointless nullptr check?
>> <+59>: je     0x1377e09       ; <+73>
>> <+61>: cmpb   $0x29, %cl      ; isa<BoundGenericClassType>()
>> <+64>: jne    0x1377e09       ; <+73>
>> <+66>: addq   $0x18, %rbx     ; (void*)this + 
>> offsetof(BoundGenericClassType, TheDecl)
>> <+70>: movq   (%rbx), %rax    ; load the decl pointer
>> <+73>: popq   %rbx
>> <+74>: retq   
>> 
>> I’ve tried adding different “nonnull” spellings in various parts of both 
>> Swift and LLVM’s casting machinery, but with no luck. The only thing that 
>> seems to work is to create a free function that takes a non-null “const 
>> TypeBase *” parameter and then have CanType::getClassOrBoundGenericClass() 
>> call that.
>> 
>> FWIW – I *suspect* this is because LLVM’s casting machinery internally 
>> converts traditional pointers into C++ references before ultimately calling 
>> classof(&Val).
>> 
>> Before I file a bug against clang/llvm, might I be missing something? Can 
>> anybody think of a good workaround?
>> 
>> Dave
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-dev
> 

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to