From 54225a9153715dfd9a14f226bdb734476cf11759 Mon Sep 17 00:00:00 2001 From: Mike Aizatsky Date: Wed, 18 Nov 2015 20:43:00 +0000 Subject: [PATCH] Disable gvn non-local speculative loads under asan. Summary: Fix for https://llvm.org/bugs/show_bug.cgi?id=25550 Differential Revision: http://reviews.llvm.org/D14763 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253498 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/GVN.cpp | 4 ++ .../GVN/no_speculative_loads_with_asan.ll | 57 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 test/Transforms/GVN/no_speculative_loads_with_asan.ll diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index 06faa2d76b6..d261b2acae9 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -1701,6 +1701,10 @@ bool GVN::PerformLoadPRE(LoadInst *LI, AvailValInBlkVect &ValuesPerBlock, /// Attempt to eliminate a load whose dependencies are /// non-local by performing PHI construction. bool GVN::processNonLocalLoad(LoadInst *LI) { + // non-local speculations are not allowed under asan. + if (LI->getParent()->getParent()->hasFnAttribute(Attribute::SanitizeAddress)) + return false; + // Step 1: Find the non-local dependencies of the load. LoadDepVect Deps; MD->getNonLocalPointerDependency(LI, Deps); diff --git a/test/Transforms/GVN/no_speculative_loads_with_asan.ll b/test/Transforms/GVN/no_speculative_loads_with_asan.ll new file mode 100644 index 00000000000..2e790db1b2a --- /dev/null +++ b/test/Transforms/GVN/no_speculative_loads_with_asan.ll @@ -0,0 +1,57 @@ +; RUN: opt -O3 -S %s | FileCheck %s +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +declare noalias i8* @_Znam(i64) #1 + +define i32 @TestNoAsan() { + %1 = tail call noalias i8* @_Znam(i64 2) + %2 = getelementptr inbounds i8, i8* %1, i64 1 + store i8 0, i8* %2, align 1 + store i8 0, i8* %1, align 1 + %3 = bitcast i8* %1 to i16* + %4 = load i16, i16* %3, align 4 + %5 = icmp eq i16 %4, 0 + br i1 %5, label %11, label %6 + +;