diff options
author | Davide Italiano <davide@freebsd.org> | 2017-01-31 18:09:05 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2017-01-31 18:09:05 +0000 |
commit | aec4617dc8a8174c43dcf31c161a100f29b50d1e (patch) | |
tree | 1f2f4153e83ff2080a333081359183687bdd49e8 | |
parent | c0eeee7a7820e0d62c0269c69a3dfd9fb6fb5448 (diff) | |
download | bcm5719-llvm-aec4617dc8a8174c43dcf31c161a100f29b50d1e.tar.gz bcm5719-llvm-aec4617dc8a8174c43dcf31c161a100f29b50d1e.zip |
[Instcombine] Combine consecutive identical fences
Differential Revision: https://reviews.llvm.org/D29314
llvm-svn: 293661
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineInternal.h | 1 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/consecutive-fences.ll | 47 |
3 files changed, 57 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 19746651d99..56983dc6036 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -3268,6 +3268,15 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { return visitCallSite(II); } +// Fence instruction simplification +Instruction *InstCombiner::visitFenceInst(FenceInst &FI) { + // Remove identical consecutive fences. + if (auto *NFI = dyn_cast<FenceInst>(FI.getNextNode())) + if (FI.isIdenticalTo(NFI)) + return eraseInstFromFunction(FI); + return nullptr; +} + // InvokeInst simplification // Instruction *InstCombiner::visitInvokeInst(InvokeInst &II) { diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h index 9c684f11087..9f16a6f6e1e 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h +++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h @@ -289,6 +289,7 @@ public: Instruction *visitLoadInst(LoadInst &LI); Instruction *visitStoreInst(StoreInst &SI); Instruction *visitBranchInst(BranchInst &BI); + Instruction *visitFenceInst(FenceInst &FI); Instruction *visitSwitchInst(SwitchInst &SI); Instruction *visitReturnInst(ReturnInst &RI); Instruction *visitInsertValueInst(InsertValueInst &IV); diff --git a/llvm/test/Transforms/InstCombine/consecutive-fences.ll b/llvm/test/Transforms/InstCombine/consecutive-fences.ll new file mode 100644 index 00000000000..6f1c4127738 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/consecutive-fences.ll @@ -0,0 +1,47 @@ +; RUN: opt -instcombine -S %s | FileCheck %s + +; Make sure we collapse the fences in this case + +; CHECK-LABEL: define void @tinkywinky +; CHECK-NEXT: fence seq_cst +; CHECK-NEXT: fence singlethread acquire +; CHECK-NEXT: ret void +; CHECK-NEXT: } + +define void @tinkywinky() { + fence seq_cst + fence seq_cst + fence seq_cst + fence singlethread acquire + fence singlethread acquire + fence singlethread acquire + ret void +} + +; CHECK-LABEL: define void @dipsy +; CHECK-NEXT: fence seq_cst +; CHECK-NEXT: fence singlethread seq_cst +; CHECK-NEXT: ret void +; CHECK-NEXT: } + +define void @dipsy() { + fence seq_cst + fence singlethread seq_cst + ret void +} + +; CHECK-LABEL: define void @patatino +; CHECK-NEXT: fence acquire +; CHECK-NEXT: fence seq_cst +; CHECK-NEXT: fence acquire +; CHECK-NEXT: fence seq_cst +; CHECK-NEXT: ret void +; CHECK-NEXT: } + +define void @patatino() { + fence acquire + fence seq_cst + fence acquire + fence seq_cst + ret void +} |