// 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{{( protected)?}} swiftcc 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)?}} 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{{( 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{{( 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
}
