diff options
| author | Philip Reames <listmail@philipreames.com> | 2015-12-17 22:19:27 +0000 |
|---|---|---|
| committer | Philip Reames <listmail@philipreames.com> | 2015-12-17 22:19:27 +0000 |
| commit | d7a6cc859ab5683efbf87f6b82c979465e9b91a0 (patch) | |
| tree | ca8f10fa2a73cb71d0a5ed07826a3a6f5970610e /llvm/test/Transforms | |
| parent | d1fb58538ff3e9fd1a89dc4a840a48c337414027 (diff) | |
| download | bcm5719-llvm-d7a6cc859ab5683efbf87f6b82c979465e9b91a0.tar.gz bcm5719-llvm-d7a6cc859ab5683efbf87f6b82c979465e9b91a0.zip | |
[InstCombine] Extend peephole DSE to handle unordered atomics
This extends the same line of reasoning used in EarlyCSE w/http://reviews.llvm.org/D15352 to the DSE implementation in InstCombine.
Key points:
* We only remove unordered or simple stores.
* The loads producing values consumed by dead stores don't influence whether the store is dead.
Differential Revision: http://reviews.llvm.org/D15354
llvm-svn: 255932
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/store.ll | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/store.ll b/llvm/test/Transforms/InstCombine/store.ll index 5dfbd714090..b8730413f1b 100644 --- a/llvm/test/Transforms/InstCombine/store.ll +++ b/llvm/test/Transforms/InstCombine/store.ll @@ -113,6 +113,119 @@ for.end: ; preds = %for.cond ; CHECK-NEXT: store i32 %storemerge, i32* %gi, align 4, !tbaa !0 } +define void @dse1(i32* %p) { +; CHECK-LABEL: dse1 +; CHECK-NEXT: store +; CHECK-NEXT: ret + store i32 0, i32* %p + store i32 0, i32* %p + ret void +} + +; Slightly subtle: if we're mixing atomic and non-atomic access to the +; same location, then the contents of the location are undefined if there's +; an actual race. As such, we're free to pick either store under the +; assumption that we're not racing with any other thread. +define void @dse2(i32* %p) { +; CHECK-LABEL: dse2 +; CHECK-NEXT: store i32 0, i32* %p +; CHECK-NEXT: ret + store atomic i32 0, i32* %p unordered, align 4 + store i32 0, i32* %p + ret void +} + +define void @dse3(i32* %p) { +; CHECK-LABEL: dse3 +; CHECK-NEXT: store atomic i32 0, i32* %p unordered, align 4 +; CHECK-NEXT: ret + store i32 0, i32* %p + store atomic i32 0, i32* %p unordered, align 4 + ret void +} + +define void @dse4(i32* %p) { +; CHECK-LABEL: dse4 +; CHECK-NEXT: store atomic i32 0, i32* %p unordered, align 4 +; CHECK-NEXT: ret + store atomic i32 0, i32* %p unordered, align 4 + store atomic i32 0, i32* %p unordered, align 4 + ret void +} + +; Implementation limit - could remove unordered store here, but +; currently don't. +define void @dse5(i32* %p) { +; CHECK-LABEL: dse5 +; CHECK-NEXT: store +; CHECK-NEXT: store +; CHECK-NEXT: ret + store atomic i32 0, i32* %p unordered, align 4 + store atomic i32 0, i32* %p seq_cst, align 4 + ret void +} + +define void @write_back1(i32* %p) { +; CHECK-LABEL: write_back1 +; CHECK-NEXT: ret + %v = load i32, i32* %p + store i32 %v, i32* %p + ret void +} + +define void @write_back2(i32* %p) { +; CHECK-LABEL: write_back2 +; CHECK-NEXT: ret + %v = load atomic i32, i32* %p unordered, align 4 + store i32 %v, i32* %p + ret void +} + +define void @write_back3(i32* %p) { +; CHECK-LABEL: write_back3 +; CHECK-NEXT: ret + %v = load i32, i32* %p + store atomic i32 %v, i32* %p unordered, align 4 + ret void +} + +define void @write_back4(i32* %p) { +; CHECK-LABEL: write_back4 +; CHECK-NEXT: ret + %v = load atomic i32, i32* %p unordered, align 4 + store atomic i32 %v, i32* %p unordered, align 4 + ret void +} + +; Can't remove store due to ordering side effect +define void @write_back5(i32* %p) { +; CHECK-LABEL: write_back5 +; CHECK-NEXT: load +; CHECK-NEXT: store +; CHECK-NEXT: ret + %v = load atomic i32, i32* %p unordered, align 4 + store atomic i32 %v, i32* %p seq_cst, align 4 + ret void +} + +define void @write_back6(i32* %p) { +; CHECK-LABEL: write_back6 +; CHECK-NEXT: load +; CHECK-NEXT: ret + %v = load atomic i32, i32* %p seq_cst, align 4 + store atomic i32 %v, i32* %p unordered, align 4 + ret void +} + +define void @write_back7(i32* %p) { +; CHECK-LABEL: write_back7 +; CHECK-NEXT: load +; CHECK-NEXT: ret + %v = load atomic volatile i32, i32* %p seq_cst, align 4 + store atomic i32 %v, i32* %p unordered, align 4 + ret void +} + !0 = !{!4, !4, i64 0} !1 = !{!"omnipotent char", !2} !2 = !{!"Simple C/C++ TBAA"} |

