Skip to content

Commit ac791c0

Browse files
committed
Added opt.
1 parent 65147d2 commit ac791c0

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

llvm/lib/Transforms/Scalar/InferAlignment.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
#include "llvm/Analysis/ValueTracking.h"
1717
#include "llvm/IR/Instructions.h"
1818
#include "llvm/IR/IntrinsicInst.h"
19+
#include "llvm/IR/PatternMatch.h"
1920
#include "llvm/Support/KnownBits.h"
2021
#include "llvm/Transforms/Scalar.h"
2122
#include "llvm/Transforms/Utils/Local.h"
2223

2324
using namespace llvm;
25+
using namespace llvm::PatternMatch;
2426

2527
static bool tryToImproveAlign(
2628
const DataLayout &DL, Instruction *I,
@@ -136,6 +138,25 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) {
136138
InferFromBasePointer(PtrOp, OldAlign));
137139
});
138140
}
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+
}
139160
}
140161

141162
return Changed;

llvm/test/Transforms/InferAlignment/ptrtoint.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ define i64 @base(ptr %0) {
77
; CHECK-NEXT: [[V1:%.*]] = load i32, ptr [[TMP0]], align 4
88
; CHECK-NEXT: [[V3:%.*]] = ptrtoint ptr [[TMP0]] to i64
99
; CHECK-NEXT: [[V5:%.*]] = and i64 [[V3]], 2
10-
; CHECK-NEXT: ret i64 [[V5]]
10+
; CHECK-NEXT: ret i64 0
1111
;
1212
%v1 = load i32, ptr %0, align 4
1313
%v3 = ptrtoint ptr %0 to i64
@@ -22,7 +22,7 @@ define i64 @best_alignment(ptr %0) {
2222
; CHECK-NEXT: [[V1_3:%.*]] = load i32, ptr [[TMP0]], align 16
2323
; CHECK-NEXT: [[V3:%.*]] = ptrtoint ptr [[TMP0]] to i64
2424
; CHECK-NEXT: [[V5:%.*]] = and i64 [[V3]], 15
25-
; CHECK-NEXT: ret i64 [[V5]]
25+
; CHECK-NEXT: ret i64 0
2626
;
2727
%v1 = load i32, ptr %0, align 8
2828
%v2 = load i32, ptr %0, align 16

0 commit comments

Comments
 (0)