Index: lib/CodeGen/CGExpr.cpp =================================================================== --- lib/CodeGen/CGExpr.cpp +++ lib/CodeGen/CGExpr.cpp @@ -547,6 +547,23 @@ // Blacklist based on the mangled type. if (!CGM.getSanitizerBlacklist().isBlacklistedType(Out.str())) { + llvm::BasicBlock *VptrNullBlock = nullptr; + llvm::BasicBlock *VptrNotNullBlock = nullptr; + + // Skip Vptr checks when the pointer value is null. This is redundant if + // -fsanitize=null is used. + // FIXME: Add optional flags. + if (TCK_DowncastPointer && !SanOpts->Null) { + Cond = Builder.CreateICmpNE( + Address, llvm::Constant::getNullValue(Address->getType())); + + VptrNullBlock = createBasicBlock("vptr_null"); + VptrNotNullBlock = createBasicBlock("not.vptr_null"); + + Builder.CreateCondBr(Cond, VptrNotNullBlock, VptrNullBlock); + EmitBlock(VptrNotNullBlock); + } + llvm::hash_code TypeHash = hash_value(Out.str()); // Load the vptr, and compute hash_16_bytes(TypeHash, vptr). @@ -585,6 +602,11 @@ EmitCheck(Builder.CreateICmpEQ(CacheVal, Hash), "dynamic_type_cache_miss", StaticData, DynamicData, CRK_AlwaysRecoverable); + + if (VptrNullBlock) { + Builder.CreateBr(VptrNullBlock); + EmitBlock(VptrNullBlock); + } } }