Skip to content

[IRGen][Runtime] Adjust the ObjC reserved bits on x86-64 to exactly match what the target uses. #19540

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 4, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/Testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,9 @@ code for the target that is not the build machine:
* ``%target-os``: the target operating system (``macosx``, ``darwin``,
``linux``, ``freebsd``, ``windows-cygnus``, ``windows-gnu``).

* ``%target-is-simulator``: ``true`` if the target is a simulator (iOS,
watchOS, tvOS), otherwise ``false``.

* ``%target-object-format``: the platform's object format (``elf``, ``macho``,
``coff``).

Expand Down
11 changes: 9 additions & 2 deletions lib/IRGen/SwiftTargetInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "swift/ABI/System.h"
#include "swift/AST/ASTContext.h"
#include "swift/AST/IRGenOptions.h"
#include "swift/Basic/Platform.h"

using namespace swift;
using namespace irgen;
Expand Down Expand Up @@ -66,10 +67,16 @@ static void configureX86_64(IRGenModule &IGM, const llvm::Triple &triple,
SwiftTargetInfo &target) {
setToMask(target.PointerSpareBits, 64,
SWIFT_ABI_X86_64_SWIFT_SPARE_BITS_MASK);
setToMask(target.ObjCPointerReservedBits, 64,
SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK);
setToMask(target.IsObjCPointerBit, 64, SWIFT_ABI_X86_64_IS_OBJC_BIT);

if (tripleIsAnySimulator(triple)) {
setToMask(target.ObjCPointerReservedBits, 64,
SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK);
} else {
setToMask(target.ObjCPointerReservedBits, 64,
SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK);
}

if (triple.isOSDarwin()) {
target.LeastValidPointerValue =
SWIFT_ABI_DARWIN_X86_64_LEAST_VALID_POINTER;
Expand Down
1 change: 1 addition & 0 deletions stdlib/public/SwiftShims/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ set(sources
SwiftStddef.h
SwiftStdint.h
System.h
Target.h
ThreadLocalStorage.h
UnicodeShims.h
Visibility.h
Expand Down
36 changes: 30 additions & 6 deletions stdlib/public/SwiftShims/HeapObject.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "RefCount.h"
#include "SwiftStddef.h"
#include "System.h"
#include "Target.h"

#define SWIFT_ABI_HEAP_OBJECT_HEADER_SIZE_64 16
#define SWIFT_ABI_HEAP_OBJECT_HEADER_SIZE_32 8
Expand Down Expand Up @@ -117,10 +118,20 @@ static_assert(alignof(HeapObject) == alignof(void*),
#endif
#define _swift_abi_SwiftSpareBitsMask \
(__swift_uintptr_t) SWIFT_ABI_X86_64_SWIFT_SPARE_BITS_MASK
#if SWIFT_TARGET_OS_SIMULATOR
#define _swift_abi_ObjCReservedBitsMask \
(__swift_uintptr_t) SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK
#define _swift_abi_ObjCReservedLowBits \
(unsigned) SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS
#else
#define _swift_abi_ObjCReservedBitsMask \
(__swift_uintptr_t) SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK
#define _swift_abi_ObjCReservedLowBits \
(unsigned) SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS
#endif

#define _swift_BridgeObject_TaggedPointerBits \
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64

#elif defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64)

Expand All @@ -137,6 +148,8 @@ static_assert(alignof(HeapObject) == alignof(void*),
(__swift_uintptr_t) SWIFT_ABI_ARM64_OBJC_RESERVED_BITS_MASK
#define _swift_abi_ObjCReservedLowBits \
(unsigned) SWIFT_ABI_ARM64_OBJC_NUM_RESERVED_LOW_BITS
#define _swift_BridgeObject_TaggedPointerBits \
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64

#elif defined(__powerpc64__)

Expand All @@ -148,6 +161,8 @@ static_assert(alignof(HeapObject) == alignof(void*),
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK
#define _swift_abi_ObjCReservedLowBits \
(unsigned) SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS
#define _swift_BridgeObject_TaggedPointerBits \
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64

#elif defined(__s390x__)

Expand All @@ -159,6 +174,8 @@ static_assert(alignof(HeapObject) == alignof(void*),
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK
#define _swift_abi_ObjCReservedLowBits \
(unsigned) SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS
#define _swift_BridgeObject_TaggedPointerBits \
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64

#else

Expand All @@ -180,6 +197,15 @@ static_assert(alignof(HeapObject) == alignof(void*),
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK
#define _swift_abi_ObjCReservedLowBits \
(unsigned) SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS

#if __POINTER_WIDTH__ == 64
#define _swift_BridgeObject_TaggedPointerBits \
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64
#else
#define _swift_BridgeObject_TaggedPointerBits \
(__swift_uintptr_t) SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_32
#endif

#endif

/// Corresponding namespaced decls
Expand All @@ -191,13 +217,11 @@ static const __swift_uintptr_t SwiftSpareBitsMask =
_swift_abi_SwiftSpareBitsMask;
static const __swift_uintptr_t ObjCReservedBitsMask =
_swift_abi_ObjCReservedBitsMask;
static const unsigned ObjCReservedLowBits = _swift_abi_ObjCReservedLowBits;
static const unsigned ObjCReservedLowBits =
_swift_abi_ObjCReservedLowBits;
static const __swift_uintptr_t BridgeObjectTagBitsMask =
_swift_BridgeObject_TaggedPointerBits;
} // heap_object_abi
#endif // __cplusplus

/// BridgeObject masks

#define _swift_BridgeObject_TaggedPointerBits _swift_abi_ObjCReservedBitsMask


#endif // SWIFT_STDLIB_SHIMS_HEAPOBJECT_H
22 changes: 17 additions & 5 deletions stdlib/public/SwiftShims/System.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@
#define SWIFT_ABI_DEFAULT_OBJC_WEAK_REFERENCE_MARKER_MASK 0
#define SWIFT_ABI_DEFAULT_OBJC_WEAK_REFERENCE_MARKER_VALUE 0

// BridgeObject uses this bit to indicate a tagged value.
#define SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_32 0U
#define SWIFT_ABI_DEFAULT_BRIDGEOBJECT_TAG_64 0x8000000000000000ULL

/*********************************** i386 *************************************/

// Heap objects are pointer-aligned, so the low two bits are unused.
Expand Down Expand Up @@ -102,22 +106,30 @@
// Only the bottom 56 bits are used, and heap objects are eight-byte-aligned.
#define SWIFT_ABI_X86_64_SWIFT_SPARE_BITS_MASK 0xFF00000000000007ULL

// Objective-C reserves the high and low bits for tagged pointers.
// Systems exist which use either bit.
#define SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK 0x8000000000000001ULL
// Objective-C reserves the low bit for tagged pointers on macOS, but
// reserves the high bit on simulators.
#define SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK 0x0000000000000001ULL
#define SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS 1
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK 0x8000000000000000ULL
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS 0


// BridgeObject uses this bit to indicate whether it holds an ObjC object or
// not.
#define SWIFT_ABI_X86_64_IS_OBJC_BIT 0x4000000000000000ULL

// ObjC weak reference discriminator is the two bits
// reserved for ObjC tagged pointers plus one more low bit.
// ObjC weak reference discriminator is the bit reserved for ObjC tagged
// pointers plus one more low bit.
#define SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_MASK \
(SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK | \
1<<SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS)
#define SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_VALUE \
(1<<SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS)
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_MASK \
(SWIFT_ABI_X86_64_SIMULATOR_OBJC_RESERVED_BITS_MASK | \
1<<SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS)
#define SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_VALUE \
(1<<SWIFT_ABI_X86_64_SIMULATOR_OBJC_NUM_RESERVED_LOW_BITS)

/*********************************** arm64 ************************************/

Expand Down
32 changes: 32 additions & 0 deletions stdlib/public/SwiftShims/Target.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//===--- Target.h - Info about the current compilation target ---*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// Info about the current compilation target.
//
//===----------------------------------------------------------------------===//

#ifndef SWIFT_ABI_TARGET_H
#define SWIFT_ABI_TARGET_H

#if !defined(__has_builtin)
#define __has_builtin(x) 0
#endif

// Is the target platform a simulator? We can't use TargetConditionals
// when included from SwiftShims, so use the builtin.
#if __has_builtin(__is_target_environment)
# if __is_target_environment(simulator)
# define SWIFT_TARGET_OS_SIMULATOR 1
# endif
#endif

#endif /* SWIFT_ABI_TARGET_H */
3 changes: 2 additions & 1 deletion stdlib/public/core/BridgeStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ struct _BridgeStorage<
public // @testable
func isNativeWithClearedSpareBits(_ bits: Int) -> Bool {
return (_bitPattern(rawValue) &
(_objCTaggedPointerBits | _objectPointerIsObjCBit |
(_bridgeObjectTaggedPointerBits | _objCTaggedPointerBits |
_objectPointerIsObjCBit |
(UInt(bits)) << _objectPointerLowSpareBitShift)) == 0
}

Expand Down
22 changes: 13 additions & 9 deletions stdlib/public/core/Builtin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -340,13 +340,17 @@ internal func _isValidAddress(_ address: UInt) -> Bool {
// TODO(<rdar://problem/34837023>): Get rid of superfluous UInt constructor
// calls
@inlinable
internal var _objCTaggedPointerBits: UInt {
internal var _bridgeObjectTaggedPointerBits: UInt {
@inline(__always) get { return UInt(_swift_BridgeObject_TaggedPointerBits) }
}
@inlinable
internal var _objCTaggedPointerBits: UInt {
@inline(__always) get { return UInt(_swift_abi_ObjCReservedBitsMask) }
}
@inlinable
internal var _objectPointerSpareBits: UInt {
@inline(__always) get {
return UInt(_swift_abi_SwiftSpareBitsMask) & ~_objCTaggedPointerBits
return UInt(_swift_abi_SwiftSpareBitsMask) & ~_bridgeObjectTaggedPointerBits
}
}
@inlinable
Expand Down Expand Up @@ -400,12 +404,12 @@ internal func _isObjCTaggedPointer(_ x: UInt) -> Bool {

@inlinable @inline(__always) public // FIXME
func _isTaggedObject(_ x: Builtin.BridgeObject) -> Bool {
return _bitPattern(x) & _objCTaggedPointerBits != 0
return _bitPattern(x) & _bridgeObjectTaggedPointerBits != 0
}
@inlinable @inline(__always) public // FIXME
func _isNativePointer(_ x: Builtin.BridgeObject) -> Bool {
return (
_bitPattern(x) & (_objCTaggedPointerBits | _objectPointerIsObjCBit)
_bitPattern(x) & (_bridgeObjectTaggedPointerBits | _objectPointerIsObjCBit)
) == 0
}
@inlinable @inline(__always) public // FIXME
Expand All @@ -418,7 +422,7 @@ func _isNonTaggedObjCPointer(_ x: Builtin.BridgeObject) -> Bool {
func _getNonTagBits(_ x: Builtin.BridgeObject) -> UInt {
// Zero out the tag bits, and leave them all at the top.
_sanityCheck(_isTaggedObject(x), "not tagged!")
return (_bitPattern(x) & ~_objCTaggedPointerBits)
return (_bitPattern(x) & ~_bridgeObjectTaggedPointerBits)
>> _objectPointerLowSpareBitShift
}

Expand Down Expand Up @@ -446,7 +450,7 @@ public func _bridgeObject(
@inline(__always)
@inlinable
public func _bridgeObject(fromTagged x: UInt) -> Builtin.BridgeObject {
_sanityCheck(x & _objCTaggedPointerBits != 0)
_sanityCheck(x & _bridgeObjectTaggedPointerBits != 0)
let object: Builtin.BridgeObject = Builtin.valueToBridgeObject(x)
_sanityCheck(_isTaggedObject(object))
return object
Expand All @@ -458,9 +462,9 @@ public func _bridgeObject(taggingPayload x: UInt) -> Builtin.BridgeObject {
let shifted = x &<< _objectPointerLowSpareBitShift
_sanityCheck(x == (shifted &>> _objectPointerLowSpareBitShift),
"out-of-range: limited bit range requires some zero top bits")
_sanityCheck(shifted & _objCTaggedPointerBits == 0,
_sanityCheck(shifted & _bridgeObjectTaggedPointerBits == 0,
"out-of-range: post-shift use of tag bits")
return _bridgeObject(fromTagged: shifted | _objCTaggedPointerBits)
return _bridgeObject(fromTagged: shifted | _bridgeObjectTaggedPointerBits)
}

// BridgeObject -> Values
Expand All @@ -485,7 +489,7 @@ public func _bridgeObject(
public func _bridgeObject(toTagged x: Builtin.BridgeObject) -> UInt {
_sanityCheck(_isTaggedObject(x))
let bits = _bitPattern(x)
_sanityCheck(bits & _objCTaggedPointerBits != 0)
_sanityCheck(bits & _bridgeObjectTaggedPointerBits != 0)
return bits
}
@inline(__always)
Expand Down
7 changes: 4 additions & 3 deletions stdlib/public/runtime/SwiftObject.mm
Original file line number Diff line number Diff line change
Expand Up @@ -489,10 +489,11 @@ - (BOOL)isNSValue__ { return NO; }
#endif
}

// The non-pointer bits, excluding the ObjC tag bits.
// The non-pointer bits, excluding the tag bits.
static auto const unTaggedNonNativeBridgeObjectBits
= heap_object_abi::SwiftSpareBitsMask
& ~heap_object_abi::ObjCReservedBitsMask;
& ~heap_object_abi::ObjCReservedBitsMask
& ~heap_object_abi::BridgeObjectTagBitsMask;

#if SWIFT_OBJC_INTEROP

Expand Down Expand Up @@ -579,7 +580,7 @@ static bool isNonNative_unTagged_bridgeObject(void *object) {
static_assert((heap_object_abi::SwiftSpareBitsMask & objectPointerIsObjCBit) ==
objectPointerIsObjCBit,
"isObjC bit not within spare bits");
return (uintptr_t(object) & objectPointerIsObjCBit) != 0;
return (uintptr_t(object) & objectPointerIsObjCBit) != 0 && (uintptr_t(object) & heap_object_abi::BridgeObjectTagBitsMask) == 0;
}
#endif

Expand Down
4 changes: 4 additions & 0 deletions stdlib/public/runtime/WeakReference.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "swift/Runtime/Config.h"
#include "swift/Runtime/HeapObject.h"
#include "swift/Runtime/Metadata.h"
#include "../../../stdlib/public/SwiftShims/Target.h"

#if SWIFT_OBJC_INTEROP
#include "swift/Runtime/ObjCBridge.h"
Expand Down Expand Up @@ -78,6 +79,9 @@ class WeakReferenceBits {
#if !SWIFT_OBJC_INTEROP
NativeMarkerMask = 0,
NativeMarkerValue = 0
#elif defined(__x86_64__) && SWIFT_TARGET_OS_SIMULATOR
NativeMarkerMask = SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_MASK,
NativeMarkerValue = SWIFT_ABI_X86_64_SIMULATOR_OBJC_WEAK_REFERENCE_MARKER_VALUE
#elif defined(__x86_64__)
NativeMarkerMask = SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_MASK,
NativeMarkerValue = SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_VALUE
Expand Down
2 changes: 1 addition & 1 deletion test/IRGen/bridge_object_x86_64.sil
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ entry(%c : $C, %w : $Builtin.Word):
// 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: [[TAGBITS:%.*]] = and i64 [[BOBITS]], 1
// CHECK: [[TAGGED:%.*]] = icmp eq i64 [[TAGBITS]], 0
// CHECK: br i1 [[TAGGED]], label %not-tagged-pointer, label %tagged-pointer
// CHECK: tagged-pointer:
Expand Down
17 changes: 11 additions & 6 deletions test/IRGen/enum.sil
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// #if directives don't work with SIL keywords, therefore please put ObjC tests
// in `enum_objc.sil`.
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize

// REQUIRES: CPU=i386 || CPU=x86_64
Expand Down Expand Up @@ -1134,8 +1134,10 @@ enum SinglePayloadClass {
// CHECK-64: entry:
// CHECK-64: switch i64 %0, label {{%.*}} [
// CHECK-64: i64 0, label {{%.*}}
// CHECK-objc-64: i64 2, label {{%.*}}
// CHECK-objc-64: i64 4, label {{%.*}}
// CHECK-objc-64-simulator-false: i64 2, label {{%.*}}
// CHECK-objc-64-simulator-false: i64 4, label {{%.*}}
// CHECK-objc-64-simulator-true: i64 1, label {{%.*}}
// CHECK-objc-64-simulator-true: i64 2, label {{%.*}}
// CHECK-native-64: i64 1, label {{%.*}}
// CHECK-native-64: i64 2, label {{%.*}}
// CHECK-64: ]
Expand Down Expand Up @@ -1179,8 +1181,10 @@ enum SinglePayloadClassProtocol {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i64, i64) {{.*}} {
// CHECK-64: switch i64 %0, label {{%.*}} [
// CHECK-64: i64 0, label {{%.*}}
// CHECK-objc-64: i64 2, label {{%.*}}
// CHECK-objc-64: i64 4, label {{%.*}}
// CHECK-objc-64-simulator-false: i64 2, label {{%.*}}
// CHECK-objc-64-simulator-false: i64 4, label {{%.*}}
// CHECK-objc-64-simulator-true: i64 1, label {{%.*}}
// CHECK-objc-64-simulator-true: i64 2, label {{%.*}}
// CHECK-native-64: i64 1, label {{%.*}}
// CHECK-native-64: i64 2, label {{%.*}}
// CHECK-64: ]
Expand Down Expand Up @@ -2457,7 +2461,8 @@ entry(%0 : $DynamicSingleton<NoPayloads>):
// Check that payloads get properly masked in nested single-payload enums.
// rdar://problem/18841262
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @optional_optional_class_protocol(i64, i64)
// CHECK-objc-64: icmp eq i64 %0, 2
// CHECK-objc-64-simulator-false: icmp eq i64 %0, 2
// CHECK-objc-64-simulator-true: icmp eq i64 %0, 1
// CHECK-native-64: icmp eq i64 %0, 1
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @optional_optional_class_protocol(i32, i32)
// CHECK-32: icmp eq i32 %0, 1
Expand Down
Loading