From 0f8bd667a1ae9106b63f4e22a5f634931074c2fa Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 10 Feb 2015 23:09:43 +0000 Subject: [PATCH] EarlyCSE: It isn't safe to CSE across synchronization boundaries This fixes PR22514. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228760 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/EarlyCSE.cpp | 3 +++ test/Transforms/EarlyCSE/basic.ll | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/Transforms/Scalar/EarlyCSE.cpp b/lib/Transforms/Scalar/EarlyCSE.cpp index 9a9f9651f3f..862622f5932 100644 --- a/lib/Transforms/Scalar/EarlyCSE.cpp +++ b/lib/Transforms/Scalar/EarlyCSE.cpp @@ -527,6 +527,9 @@ bool EarlyCSE::processNode(DomTreeNode *Node) { // Ignore volatile loads. if (MemInst.isVolatile()) { LastStore = nullptr; + // Don't CSE across synchronization boundaries. + if (Inst->mayWriteToMemory()) + ++CurrentGeneration; continue; } diff --git a/test/Transforms/EarlyCSE/basic.ll b/test/Transforms/EarlyCSE/basic.ll index dee428cc28f..5b785318a3d 100644 --- a/test/Transforms/EarlyCSE/basic.ll +++ b/test/Transforms/EarlyCSE/basic.ll @@ -193,4 +193,10 @@ define void @test11(i32 *%P) { ; CHECK-NEXT: ret void } - +define i32 @test12(i1 %B, i32* %P1, i32* %P2) { + %load0 = load i32* %P1 + %1 = load atomic i32* %P2 seq_cst, align 4 + %load1 = load i32* %P1 + %sel = select i1 %B, i32 %load0, i32 %load1 + ret i32 %sel +} -- 2.11.0