From 67f1fe8597817f9630c84d77ca23852e362e62d6 Mon Sep 17 00:00:00 2001 From: Alexander Shaposhnikov Date: Wed, 20 Jul 2022 22:29:03 +0000 Subject: [PATCH] [GlobalOpt] Enable evaluation of atomic stores Relax the check to allow evaluation of atomic stores (but still skip volatile stores). Test plan: 1/ ninja check-llvm check-clang 2/ Bootstrapped LLVM/Clang pass tests Differential revision: https://reviews.llvm.org/D129841 --- llvm/lib/Transforms/Utils/Evaluator.cpp | 6 +++--- llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/Utils/Evaluator.cpp b/llvm/lib/Transforms/Utils/Evaluator.cpp index 7b8d855..3989fbc 100644 --- a/llvm/lib/Transforms/Utils/Evaluator.cpp +++ b/llvm/lib/Transforms/Utils/Evaluator.cpp @@ -301,9 +301,9 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst, BasicBlock *&NextBB, LLVM_DEBUG(dbgs() << "Evaluating Instruction: " << *CurInst << "\n"); if (StoreInst *SI = dyn_cast(CurInst)) { - if (!SI->isSimple()) { - LLVM_DEBUG(dbgs() << "Store is not simple! Can not evaluate.\n"); - return false; // no volatile/atomic accesses. + if (SI->isVolatile()) { + LLVM_DEBUG(dbgs() << "Store is volatile! Can not evaluate.\n"); + return false; // no volatile accesses. } Constant *Ptr = getVal(SI->getOperand(1)); Constant *FoldedPtr = ConstantFoldConstant(Ptr, DL, TLI); diff --git a/llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll b/llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll index d039941..d351be1 100644 --- a/llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll +++ b/llvm/test/Transforms/GlobalOpt/ctor-list-opt.ll @@ -27,6 +27,7 @@ @Z = global i32 123 ; [#uses=1] @D = global double 0.000000e+00 ; [#uses=1] @CTORGV = internal global i1 false ; [#uses=2] +@GA = global i32 0 ; [#uses=1] define internal void @CTOR1() { ret void @@ -130,3 +131,9 @@ define internal void @CTOR11() { define internal void @CTOR12() { ret void } + +; CHECK-NOT: CTOR13 +define internal void @CTOR13() { + store atomic i32 123, i32* @GA seq_cst, align 4 + ret void +} -- 2.7.4