diff options
4 files changed, 14 insertions, 52 deletions
diff --git a/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h b/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h index f75dc4dc331..61975036e9f 100644 --- a/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h +++ b/llvm/include/llvm/Transforms/Scalar/AlignmentFromAssumptions.h @@ -33,12 +33,6 @@ struct AlignmentFromAssumptionsPass bool runImpl(Function &F, AssumptionCache &AC, ScalarEvolution *SE_, DominatorTree *DT_); - // For memory transfers, we need a common alignment for both the source and - // destination. If we have a new alignment for only one operand of a transfer - // instruction, save it in these maps. If we reach the other operand through - // another assumption later, then we may change the alignment at that point. - DenseMap<MemTransferInst *, unsigned> NewDestAlignments, NewSrcAlignments; - ScalarEvolution *SE = nullptr; DominatorTree *DT = nullptr; diff --git a/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp b/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp index 6c871bb9e7e..b84528271a7 100644 --- a/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp +++ b/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp @@ -339,53 +339,24 @@ bool AlignmentFromAssumptionsPass::processAssumption(CallInst *ACall) { unsigned NewDestAlignment = getNewAlignment(AASCEV, AlignSCEV, OffSCEV, MI->getDest(), SE); - // For memory transfers, we need a common alignment for both the - // source and destination. If we have a new alignment for this - // instruction, but only for one operand, save it. If we reach the - // other operand through another assumption later, then we may - // change the alignment at that point. + DEBUG(dbgs() << "\tmem inst: " << NewDestAlignment << "\n";); + if (NewDestAlignment > MI->getDestAlignment()) { + MI->setDestAlignment(NewDestAlignment); + ++NumMemIntAlignChanged; + } + + // For memory transfers, there is also a source alignment that + // can be set. if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI)) { unsigned NewSrcAlignment = getNewAlignment(AASCEV, AlignSCEV, OffSCEV, MTI->getSource(), SE); - DenseMap<MemTransferInst *, unsigned>::iterator DI = - NewDestAlignments.find(MTI); - unsigned AltDestAlignment = (DI == NewDestAlignments.end()) ? - 0 : DI->second; - - DenseMap<MemTransferInst *, unsigned>::iterator SI = - NewSrcAlignments.find(MTI); - unsigned AltSrcAlignment = (SI == NewSrcAlignments.end()) ? - 0 : SI->second; - - DEBUG(dbgs() << "\tmem trans: " << NewDestAlignment << " " << - AltDestAlignment << " " << NewSrcAlignment << - " " << AltSrcAlignment << "\n"); - - // Of these four alignments, pick the largest possible... - unsigned NewAlignment = 0; - if (NewDestAlignment <= std::max(NewSrcAlignment, AltSrcAlignment)) - NewAlignment = std::max(NewAlignment, NewDestAlignment); - if (AltDestAlignment <= std::max(NewSrcAlignment, AltSrcAlignment)) - NewAlignment = std::max(NewAlignment, AltDestAlignment); - if (NewSrcAlignment <= std::max(NewDestAlignment, AltDestAlignment)) - NewAlignment = std::max(NewAlignment, NewSrcAlignment); - if (AltSrcAlignment <= std::max(NewDestAlignment, AltDestAlignment)) - NewAlignment = std::max(NewAlignment, AltSrcAlignment); - - if (NewAlignment > MI->getAlignment()) { - MI->setAlignment(NewAlignment); + DEBUG(dbgs() << "\tmem trans: " << NewSrcAlignment << "\n";); + + if (NewSrcAlignment > MTI->getSourceAlignment()) { + MTI->setSourceAlignment(NewSrcAlignment); ++NumMemIntAlignChanged; } - - NewDestAlignments.insert(std::make_pair(MTI, NewDestAlignment)); - NewSrcAlignments.insert(std::make_pair(MTI, NewSrcAlignment)); - } else if (NewDestAlignment > MI->getAlignment()) { - assert((!isa<MemIntrinsic>(MI) || isa<MemSetInst>(MI)) && - "Unknown memory intrinsic"); - - MI->setAlignment(NewDestAlignment); - ++NumMemIntAlignChanged; } } @@ -419,9 +390,6 @@ bool AlignmentFromAssumptionsPass::runImpl(Function &F, AssumptionCache &AC, SE = SE_; DT = DT_; - NewDestAlignments.clear(); - NewSrcAlignments.clear(); - bool Changed = false; for (auto &AssumeVH : AC.assumptions()) if (AssumeVH) diff --git a/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll b/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll index 8bbf1c668c9..6ee08b81e27 100644 --- a/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll +++ b/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll @@ -205,7 +205,7 @@ entry: ret i32 undef ; CHECK-LABEL: @moo2 -; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* align 32 %0, i8* align 32 %1, i64 64, i1 false) +; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* align 32 %0, i8* align 128 %1, i64 64, i1 false) ; CHECK: ret i32 undef } diff --git a/llvm/test/Transforms/AlignmentFromAssumptions/simple32.ll b/llvm/test/Transforms/AlignmentFromAssumptions/simple32.ll index 379a184fd7d..5aabe951841 100644 --- a/llvm/test/Transforms/AlignmentFromAssumptions/simple32.ll +++ b/llvm/test/Transforms/AlignmentFromAssumptions/simple32.ll @@ -205,7 +205,7 @@ entry: ret i32 undef ; CHECK-LABEL: @moo2 -; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* align 32 %0, i8* align 32 %1, i64 64, i1 false) +; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* align 32 %0, i8* align 128 %1, i64 64, i1 false) ; CHECK: ret i32 undef } |