From: David Majnemer Date: Tue, 10 Feb 2015 23:09:43 +0000 (+0000) Subject: EarlyCSE: It isn't safe to CSE across synchronization boundaries X-Git-Tag: llvmorg-3.7.0-rc1~12513 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7679300d9382e351dcecf2321c71e77723d1cae3;p=platform%2Fupstream%2Fllvm.git EarlyCSE: It isn't safe to CSE across synchronization boundaries This fixes PR22514. llvm-svn: 228760 --- diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp index 9a9f965..862622f 100644 --- a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp +++ b/llvm/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/llvm/test/Transforms/EarlyCSE/basic.ll b/llvm/test/Transforms/EarlyCSE/basic.ll index dee428c..5b78531 100644 --- a/llvm/test/Transforms/EarlyCSE/basic.ll +++ b/llvm/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 +}