|
16 | 16 | #include "llvm/Analysis/ValueTracking.h" |
17 | 17 | #include "llvm/IR/Instructions.h" |
18 | 18 | #include "llvm/IR/IntrinsicInst.h" |
| 19 | +#include "llvm/IR/PatternMatch.h" |
19 | 20 | #include "llvm/Support/KnownBits.h" |
20 | 21 | #include "llvm/Transforms/Scalar.h" |
21 | 22 | #include "llvm/Transforms/Utils/Local.h" |
22 | 23 |
|
23 | 24 | using namespace llvm; |
| 25 | +using namespace llvm::PatternMatch; |
24 | 26 |
|
25 | 27 | static bool tryToImproveAlign( |
26 | 28 | const DataLayout &DL, Instruction *I, |
@@ -136,6 +138,25 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) { |
136 | 138 | InferFromBasePointer(PtrOp, OldAlign)); |
137 | 139 | }); |
138 | 140 | } |
| 141 | + |
| 142 | + for (Instruction &I : BB) { |
| 143 | + Value *PtrOp; |
| 144 | + ConstantInt *Const; |
| 145 | + if (match(&I, |
| 146 | + m_c_And(m_PtrToInt(m_Value(PtrOp)), m_ConstantInt(Const)))) { |
| 147 | + Align KnownAlign = InferFromKnownBits(I, PtrOp); |
| 148 | + Align BaseAlign = PtrOp->getPointerAlignment(DL); |
| 149 | + if (auto It = BestBasePointerAligns.find(PtrOp); |
| 150 | + It != BestBasePointerAligns.end()) { |
| 151 | + BaseAlign = std::max(BaseAlign, It->second); |
| 152 | + } |
| 153 | + Align ActualAlign = std::max(KnownAlign, BaseAlign); |
| 154 | + if (Const->getValue().ult(ActualAlign.value())) { |
| 155 | + I.replaceAllUsesWith(Constant::getNullValue(I.getType())); |
| 156 | + Changed = true; |
| 157 | + } |
| 158 | + } |
| 159 | + } |
139 | 160 | } |
140 | 161 |
|
141 | 162 | return Changed; |
|
0 commit comments