Skip to content

Commit 2e1fc06

Browse files
committed
Added opt.
1 parent 1d31e85 commit 2e1fc06

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

llvm/lib/Transforms/Scalar/InferAlignment.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,20 @@
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

2327
using namespace llvm;
28+
using namespace llvm::PatternMatch;
2429

2530
static 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.

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 [[V3]], 2
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)