// RUN: %swift -assume-parsing-unqualified-ownership-sil -module-name bridge_object -emit-ir -target x86_64-apple-macosx10.9 %s | %FileCheck %s

// REQUIRES: CODEGENERATOR=X86

sil_stage canonical

import Builtin

class C {}
sil_vtable C {}

@objc protocol ObjC {}

// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @retain_release_bridge_object
// CHECK:         call [[BRIDGE:%swift.bridge\*]] @swift_bridgeObjectRetain{{.*}}returned
// CHECK:         call void @swift_bridgeObjectRelease
sil @retain_release_bridge_object : $(Builtin.BridgeObject) -> () {
entry(%b : $Builtin.BridgeObject):
  strong_retain %b : $Builtin.BridgeObject
  strong_release %b : $Builtin.BridgeObject
  return undef : $()
}

// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.bridge* @convert_to_bridge_object
// CHECK:         [[REFBITS:%.*]] = ptrtoint [[C:%T13bridge_object1CC\*]] %0 to i64
// CHECK:         [[OR:%.*]] = or i64 [[REFBITS]], %1
// CHECK:         inttoptr i64 [[OR]] to [[BRIDGE]]
sil @convert_to_bridge_object : $(C, Builtin.Word) -> Builtin.BridgeObject {
entry(%c : $C, %w : $Builtin.Word):
  %b = ref_to_bridge_object %c : $C, %w : $Builtin.Word
  return %b : $Builtin.BridgeObject
}

// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i64 } @convert_from_bridge_object
// CHECK:         [[BOBITS:%.*]] = ptrtoint [[BRIDGE]] %0 to i64
// --                                                     0x8000_0000_0000_0001
// CHECK:         [[TAGBITS:%.*]] = and i64 [[BOBITS]], -9223372036854775807
// CHECK:         [[TAGGED:%.*]] = icmp eq i64 [[TAGBITS]], 0
// CHECK:         br i1 [[TAGGED]], label %not-tagged-pointer, label %tagged-pointer
// CHECK:       tagged-pointer:
// CHECK:         [[TAGGED_RESULT:%.*]] = bitcast [[BRIDGE]] %0 to [[C:%objc_object\*]]
// CHECK:         br label %tagged-cont
// CHECK:       not-tagged-pointer:
// --                                                     0x00ff_ffff_ffff_fff8
// CHECK:         [[MASKED_BITS:%.*]] = and i64 [[BOBITS]], 72057594037927928
// CHECK:         [[MASKED_RESULT:%.*]] = inttoptr i64 [[MASKED_BITS]] to [[C]]
// CHECK:         br label %tagged-cont
// CHECK:      tagged-cont:
// CHECK:         phi [[C]] [ [[TAGGED_RESULT]], %tagged-pointer ], [ [[MASKED_RESULT]], %not-tagged-pointer ]

sil @convert_from_bridge_object : $Builtin.BridgeObject -> (ObjC, Builtin.Word) {
entry(%b : $Builtin.BridgeObject):
  %c = bridge_object_to_ref %b : $Builtin.BridgeObject to $ObjC
  %w = bridge_object_to_word %b : $Builtin.BridgeObject to $Builtin.Word
  %t = tuple (%c : $ObjC, %w : $Builtin.Word)
  return %t : $(ObjC, Builtin.Word)
}

// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T13bridge_object1CC* @convert_from_native_bridge_object
// CHECK:         [[BOBITS:%.*]] = ptrtoint %swift.bridge* %0 to i64
// CHECK:         [[MASKED_BITS:%.*]] = and i64 [[BOBITS]], 72057594037927928
// CHECK:         [[RESULT:%.*]] = inttoptr i64 [[MASKED_BITS]] to [[C:%T13bridge_object1CC\*]]
// CHECK:         ret %T13bridge_object1CC* [[RESULT]]
sil @convert_from_native_bridge_object : $Builtin.BridgeObject -> C {
entry(%b : $Builtin.BridgeObject):
  %c = bridge_object_to_ref %b : $Builtin.BridgeObject to $C
  return %c : $C
}
