diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-02-10 23:09:43 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-02-10 23:09:43 +0000 |
commit | 7679300d9382e351dcecf2321c71e77723d1cae3 (patch) | |
tree | 6604b63f04397f27d412c45af8e2a1bf7a8a3c4c | |
parent | bb557065f60fa03e7a46a0b69bc0abea6ae46ca4 (diff) | |
download | bcm5719-llvm-7679300d9382e351dcecf2321c71e77723d1cae3.tar.gz bcm5719-llvm-7679300d9382e351dcecf2321c71e77723d1cae3.zip |
EarlyCSE: It isn't safe to CSE across synchronization boundaries
This fixes PR22514.
llvm-svn: 228760
-rw-r--r-- | llvm/lib/Transforms/Scalar/EarlyCSE.cpp | 3 | ||||
-rw-r--r-- | llvm/test/Transforms/EarlyCSE/basic.ll | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/EarlyCSE.cpp b/llvm/lib/Transforms/Scalar/EarlyCSE.cpp index 9a9f9651f3f..862622f5932 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 dee428cc28f..5b785318a3d 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 +} |