1212// ===----------------------------------------------------------------------===//
1313
1414#include " llvm/Transforms/Scalar/InferAlignment.h"
15+ #include " llvm/ADT/APInt.h"
16+ #include " llvm/ADT/STLFunctionalExtras.h"
1517#include " llvm/Analysis/AssumptionCache.h"
1618#include " llvm/Analysis/ValueTracking.h"
19+ #include " llvm/IR/Instruction.h"
1720#include " llvm/IR/Instructions.h"
1821#include " llvm/IR/IntrinsicInst.h"
22+ #include " llvm/IR/PatternMatch.h"
1923#include " llvm/Support/KnownBits.h"
2024#include " llvm/Transforms/Scalar.h"
2125#include " llvm/Transforms/Utils/Local.h"
2226
2327using namespace llvm ;
28+ using namespace llvm ::PatternMatch;
2429
2530static bool tryToImproveAlign (
2631 const DataLayout &DL, Instruction *I,
@@ -37,6 +42,16 @@ static bool tryToImproveAlign(
3742 }
3843 }
3944
45+ Value *PtrOp;
46+ const APInt *Const;
47+ if (match (I, m_And (m_PtrToIntOrAddr (m_Value (PtrOp)), m_APInt (Const)))) {
48+ Align ActualAlign = Fn (PtrOp, Align (1 ), Align (1 ));
49+ if (Const->ult (ActualAlign.value ())) {
50+ I->replaceAllUsesWith (Constant::getNullValue (I->getType ()));
51+ return true ;
52+ }
53+ }
54+
4055 IntrinsicInst *II = dyn_cast<IntrinsicInst>(I);
4156 if (!II)
4257 return false ;
@@ -120,6 +135,15 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) {
120135 return LoadStoreAlign;
121136 };
122137
138+ auto ActualAlginFn = [&](Value *PtrOp) {
139+ Align BaseAlign = PtrOp->getPointerAlignment (DL);
140+ if (auto It = BestBasePointerAligns.find (PtrOp);
141+ It != BestBasePointerAligns.end ()) {
142+ BaseAlign = std::max (BaseAlign, It->second );
143+ }
144+ return BaseAlign;
145+ };
146+
123147 for (BasicBlock &BB : F) {
124148 // We need to reset the map for each block because alignment information
125149 // can only be propagated from instruction A to B if A dominates B.
0 commit comments