diff options
Diffstat (limited to 'clang/lib/CodeGen/CGExprScalar.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 33 |
1 files changed, 10 insertions, 23 deletions
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index e9bdbda34aa..e763e6ab020 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -19,7 +19,6 @@ #include "TargetInfo.h" #include "clang/AST/ASTContext.h" #include "clang/AST/DeclObjC.h" -#include "clang/AST/Expr.h" #include "clang/AST/RecordLayout.h" #include "clang/AST/StmtVisitor.h" #include "clang/Basic/TargetInfo.h" @@ -172,9 +171,9 @@ public: } /// EmitPointerToBoolConversion - Perform a pointer to boolean conversion. - Value *EmitPointerToBoolConversion(Value *V, QualType QT) { - Value *Zero = CGF.CGM.getNullPointer(cast<llvm::PointerType>(V->getType()), QT); - + Value *EmitPointerToBoolConversion(Value *V) { + Value *Zero = llvm::ConstantPointerNull::get( + cast<llvm::PointerType>(V->getType())); return Builder.CreateICmpNE(V, Zero, "tobool"); } @@ -598,7 +597,7 @@ Value *ScalarExprEmitter::EmitConversionToBool(Value *Src, QualType SrcType) { return EmitIntToBoolConversion(Src); assert(isa<llvm::PointerType>(Src->getType())); - return EmitPointerToBoolConversion(Src, SrcType); + return EmitPointerToBoolConversion(Src); } void ScalarExprEmitter::EmitFloatConversionCheck( @@ -1401,23 +1400,11 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) { return Builder.CreateBitCast(Src, DstTy); } case CK_AddressSpaceConversion: { - Expr::EvalResult Result; - if (E->EvaluateAsRValue(Result, CGF.getContext()) && - Result.Val.isNullPointer()) { - // If E has side effect, it is emitted even if its final result is a - // null pointer. In that case, a DCE pass should be able to - // eliminate the useless instructions emitted during translating E. - if (Result.HasSideEffects) - Visit(E); - return CGF.CGM.getNullPointer(cast<llvm::PointerType>( - ConvertType(DestTy)), DestTy); - } + Value *Src = Visit(const_cast<Expr*>(E)); // Since target may map different address spaces in AST to the same address // space, an address space conversion may end up as a bitcast. - auto *Src = Visit(E); - return CGF.CGM.getTargetCodeGenInfo().performAddrSpaceCast(CGF, Src, - E->getType(), - DestTy); + return Builder.CreatePointerBitCastOrAddrSpaceCast(Src, + ConvertType(DestTy)); } case CK_AtomicToNonAtomic: case CK_NonAtomicToAtomic: @@ -1472,8 +1459,8 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) { if (MustVisitNullValue(E)) (void) Visit(E); - return CGF.CGM.getNullPointer(cast<llvm::PointerType>(ConvertType(DestTy)), - DestTy); + return llvm::ConstantPointerNull::get( + cast<llvm::PointerType>(ConvertType(DestTy))); case CK_NullToMemberPointer: { if (MustVisitNullValue(E)) @@ -1566,7 +1553,7 @@ Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) { case CK_IntegralToBoolean: return EmitIntToBoolConversion(Visit(E)); case CK_PointerToBoolean: - return EmitPointerToBoolConversion(Visit(E), E->getType()); + return EmitPointerToBoolConversion(Visit(E)); case CK_FloatingToBoolean: return EmitFloatToBoolConversion(Visit(E)); case CK_MemberPointerToBoolean: { |