Skip to content

Commit ad80c6d

Browse files
committed
Added opt.
1 parent 7d53230 commit ad80c6d

File tree

2 files changed

+35
-5
lines changed

2 files changed

+35
-5
lines changed

llvm/lib/Transforms/Scalar/InferAlignment.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,26 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "llvm/Transforms/Scalar/InferAlignment.h"
15+
#include "llvm/ADT/STLFunctionalExtras.h"
1516
#include "llvm/Analysis/AssumptionCache.h"
1617
#include "llvm/Analysis/ValueTracking.h"
18+
#include "llvm/IR/Instruction.h"
1719
#include "llvm/IR/Instructions.h"
1820
#include "llvm/IR/IntrinsicInst.h"
21+
#include "llvm/IR/PatternMatch.h"
22+
#include "llvm/IR/Value.h"
23+
#include "llvm/Support/Alignment.h"
1924
#include "llvm/Support/KnownBits.h"
2025
#include "llvm/Transforms/Scalar.h"
2126
#include "llvm/Transforms/Utils/Local.h"
2227

2328
using namespace llvm;
29+
using namespace llvm::PatternMatch;
2430

2531
static bool tryToImproveAlign(
2632
const DataLayout &DL, Instruction *I,
27-
function_ref<Align(Value *PtrOp, Align OldAlign, Align PrefAlign)> Fn) {
33+
function_ref<Align(Value *PtrOp, Align OldAlign, Align PrefAlign)> Fn,
34+
function_ref<Align(Instruction &I, Value *PtrOp)> ActualAlignFn) {
2835

2936
if (auto *PtrOp = getLoadStorePointerOperand(I)) {
3037
Align OldAlign = getLoadStoreAlignment(I);
@@ -37,6 +44,16 @@ static bool tryToImproveAlign(
3744
}
3845
}
3946

47+
Value *PtrOp;
48+
ConstantInt *Const;
49+
if (match(I, m_c_And(m_PtrToIntOrAddr(m_Value(PtrOp)), m_ConstantInt(Const)))) {
50+
Align ActualAlign = ActualAlignFn(*I, PtrOp);
51+
if (Const->getValue().ult(ActualAlign.value())) {
52+
I->replaceAllUsesWith(Constant::getNullValue(I->getType()));
53+
return true;
54+
}
55+
}
56+
4057
IntrinsicInst *II = dyn_cast<IntrinsicInst>(I);
4158
if (!II)
4259
return false;
@@ -80,6 +97,8 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) {
8097
return std::max(OldAlign,
8198
tryEnforceAlignment(PtrOp, PrefAlign, DL));
8299
return OldAlign;
100+
}, [&](Instruction&, Value *PtrOp) {
101+
return PtrOp->getPointerAlignment(DL);
83102
});
84103
}
85104
}
@@ -120,6 +139,17 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) {
120139
return LoadStoreAlign;
121140
};
122141

142+
auto ActualAlginFn = [&](Instruction &I, Value *PtrOp) {
143+
Align KnownAlign = InferFromKnownBits(I, PtrOp);
144+
Align BaseAlign = PtrOp->getPointerAlignment(DL);
145+
if (auto It = BestBasePointerAligns.find(PtrOp);
146+
It != BestBasePointerAligns.end()) {
147+
BaseAlign = std::max(BaseAlign, It->second);
148+
}
149+
Align ActualAlign = std::max(KnownAlign, BaseAlign);
150+
return ActualAlign;
151+
};
152+
123153
for (BasicBlock &BB : F) {
124154
// We need to reset the map for each block because alignment information
125155
// can only be propagated from instruction A to B if A dominates B.
@@ -134,7 +164,7 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) {
134164
DL, &I, [&](Value *PtrOp, Align OldAlign, Align PrefAlign) {
135165
return std::max(InferFromKnownBits(I, PtrOp),
136166
InferFromBasePointer(PtrOp, OldAlign));
137-
});
167+
}, ActualAlginFn);
138168
}
139169
}
140170

llvm/test/Transforms/InferAlignment/ptrtoint.ll

Lines changed: 3 additions & 3 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
@@ -55,7 +55,7 @@ define i64 @ptrtoaddr(ptr %0) {
5555
; CHECK-NEXT: [[V3:%.*]] = ptrtoaddr ptr [[TMP0]] to i64
5656
; CHECK-NEXT: [[V1:%.*]] = load i32, ptr [[TMP0]], align 4
5757
; CHECK-NEXT: [[V5:%.*]] = and i64 2, [[V3]]
58-
; CHECK-NEXT: ret i64 [[V5]]
58+
; CHECK-NEXT: ret i64 0
5959
;
6060
%v3 = ptrtoaddr ptr %0 to i64
6161
%v1 = load i32, ptr %0, align 4

0 commit comments

Comments
 (0)