// RUN: %swift -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{{( protected)?}} void @retain_release_bridge_object
// CHECK:         call [[BRIDGE:%swift.bridge\*]] @swift_bridgeObjectRetain
// 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{{( protected)?}} %swift.bridge* @convert_to_bridge_object
// CHECK:         [[REFBITS:%.*]] = ptrtoint [[C:%C13bridge_object1C\*]] %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{{( protected)?}} { %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{{( protected)?}} %C13bridge_object1C* @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:%C13bridge_object1C\*]]
// CHECK:         ret %C13bridge_object1C* [[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
}
