When we are calling __builtin_constant_p with ObjC objects of
different classes, we hit the assertion
Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible type!"), function cast, file include/llvm/Support/Casting.h, line 254.
It happens because LLVM types for ObjCInterfaceType are opaque and
have no name (see CodeGenTypes::ConvertType). As the result, for
different ObjC classes we have different is_constant intrinsics with
the same name llvm.is.constant.p0s_s. When we try to reuse an
intrinsic with the same name, we fail because of type mismatch.
Fix by bitcasting ObjCObjectPointerType to id prior to passing as an
argument to __builtin_constant_p. This results in using intrinsic
llvm.is.constant.p0i8 and correct types.
rdar://problem/47499250