diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/atomic.ll | 28 |
2 files changed, 31 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index 981dfc12491..4ca9ab4447d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -867,10 +867,6 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { return replaceInstUsesWith(LI, UndefValue::get(LI.getType())); } - // TODO: The transform below needs updated for unordered loads - if (!LI.isSimple()) - return nullptr; - if (Op->hasOneUse()) { // Change select and PHI nodes to select values instead of addresses: this // helps alias analysis out a lot, allows many others simplifications, and @@ -891,8 +887,11 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { SI->getOperand(1)->getName()+".val"); LoadInst *V2 = Builder->CreateLoad(SI->getOperand(2), SI->getOperand(2)->getName()+".val"); + assert(LI.isUnordered() && "implied by above"); V1->setAlignment(Align); + V1->setAtomic(LI.getOrdering(), LI.getSynchScope()); V2->setAlignment(Align); + V2->setAtomic(LI.getOrdering(), LI.getSynchScope()); return SelectInst::Create(SI->getCondition(), V1, V2); } diff --git a/llvm/test/Transforms/InstCombine/atomic.ll b/llvm/test/Transforms/InstCombine/atomic.ll index 1d24248e73e..ac698c8425e 100644 --- a/llvm/test/Transforms/InstCombine/atomic.ll +++ b/llvm/test/Transforms/InstCombine/atomic.ll @@ -143,4 +143,32 @@ define i32 @test14() { ret i32 0 } +@a = external global i32 +@b = external global i32 + +define i32 @test15(i1 %cnd) { +; CHECK-LABEL: define i32 @test15( +; CHECK: load atomic i32, i32* @a unordered, align 4 +; CHECK: load atomic i32, i32* @b unordered, align 4 + %addr = select i1 %cnd, i32* @a, i32* @b + %x = load atomic i32, i32* %addr unordered, align 4 + ret i32 %x +} +; FIXME: This would be legal to transform +define i32 @test16(i1 %cnd) { +; CHECK-LABEL: define i32 @test16( +; CHECK: load atomic i32, i32* %addr monotonic, align 4 + %addr = select i1 %cnd, i32* @a, i32* @b + %x = load atomic i32, i32* %addr monotonic, align 4 + ret i32 %x +} + +; FIXME: This would be legal to transform +define i32 @test17(i1 %cnd) { +; CHECK-LABEL: define i32 @test17( +; CHECK: load atomic i32, i32* %addr seq_cst, align 4 + %addr = select i1 %cnd, i32* @a, i32* @b + %x = load atomic i32, i32* %addr seq_cst, align 4 + ret i32 %x +} |

