From a6e27790acb6d06be6c1113ea94165c4b7e056cd Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 6 Mar 2009 23:05:56 +0000 Subject: [PATCH] Fixed a bug where generation of read-barriers caused crash in ir-gen. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66302 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGExprScalar.cpp | 3 +++ test/CodeGenObjC/objc2-weak-compare.m | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/CodeGenObjC/objc2-weak-compare.m diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 9951d8794b..70373031bb 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -1015,6 +1015,9 @@ Value *ScalarExprEmitter::EmitCompare(const BinaryOperator *E,unsigned UICmpOpc, LHS, RHS, "cmp"); } else { // Unsigned integers and pointers. + // Casting becomes necessary with -fobjc-gc as one or the other my turn + // into an 'id' type due to generation of read barriers. + RHS = Builder.CreateBitCast(RHS, LHS->getType()); Result = Builder.CreateICmp((llvm::ICmpInst::Predicate)UICmpOpc, LHS, RHS, "cmp"); } diff --git a/test/CodeGenObjC/objc2-weak-compare.m b/test/CodeGenObjC/objc2-weak-compare.m new file mode 100644 index 0000000000..5889b1ff8d --- /dev/null +++ b/test/CodeGenObjC/objc2-weak-compare.m @@ -0,0 +1,24 @@ +// RUN: clang -fnext-runtime -fobjc-gc -emit-llvm -o %t %s + +@interface PBXTarget +{ + +PBXTarget * __weak _lastKnownTarget; +PBXTarget * __weak _KnownTarget; +PBXTarget * result; +} +- Meth; +@end + +@implementation PBXTarget +- Meth { + if (_lastKnownTarget != result) + foo(); + if (result != _lastKnownTarget) + foo(); + + if (_lastKnownTarget != _KnownTarget) + foo(); +} + +@end -- 2.40.0