[LoadCombine] Fix combining of loads which span an aliasing store.

Fixes PR31517

Differential Revision: https://reviews.llvm.org/D28922

llvm-svn: 294632
This commit is contained in:
Michael J. Spencer 2017-02-09 21:46:49 +00:00
parent 857aba4410
commit 714d9d22ad
2 changed files with 26 additions and 1 deletions

View File

@ -245,13 +245,17 @@ bool LoadCombine::runOnBasicBlock(BasicBlock &BB) {
bool Combined = false; bool Combined = false;
unsigned Index = 0; unsigned Index = 0;
for (auto &I : BB) { for (auto &I : BB) {
if (I.mayThrow() || (I.mayWriteToMemory() && AST.containsUnknown(&I))) { if (I.mayThrow() || AST.containsUnknown(&I)) {
if (combineLoads(LoadMap)) if (combineLoads(LoadMap))
Combined = true; Combined = true;
LoadMap.clear(); LoadMap.clear();
AST.clear(); AST.clear();
continue; continue;
} }
if (I.mayWriteToMemory()) {
AST.add(&I);
continue;
}
LoadInst *LI = dyn_cast<LoadInst>(&I); LoadInst *LI = dyn_cast<LoadInst>(&I);
if (!LI) if (!LI)
continue; continue;

View File

@ -37,3 +37,24 @@ define i64 @test2(i32* nocapture readonly %a, i32* nocapture readonly %b) {
ret i64 %add ret i64 %add
} }
%rec11 = type { i16, i16, i16 }
@str = global %rec11 { i16 1, i16 2, i16 3 }
; PR31517 - Check that loads which span an aliasing store are not combined.
define i16 @test3() {
; CHECK-LABEL: @test3
; CHECK: load i16, i16*
; CHECK: store i16
; CHECK: ret i16
%_tmp9 = getelementptr %rec11, %rec11* @str, i16 0, i32 1
%_tmp10 = load i16, i16* %_tmp9
%_tmp12 = getelementptr %rec11, %rec11* @str, i16 0, i32 0
store i16 %_tmp10, i16* %_tmp12
%_tmp13 = getelementptr %rec11, %rec11* @str, i16 0, i32 0
%_tmp14 = load i16, i16* %_tmp13
%_tmp15 = icmp eq i16 %_tmp14, 3
%_tmp16 = select i1 %_tmp15, i16 1, i16 0
ret i16 %_tmp16
}