12
12
// ===----------------------------------------------------------------------===//
13
13
14
14
#include " llvm/Transforms/Scalar/InferAlignment.h"
15
+ #include " llvm/ADT/DenseMap.h"
15
16
#include " llvm/Analysis/AssumptionCache.h"
16
17
#include " llvm/Analysis/ValueTracking.h"
17
18
#include " llvm/IR/Instructions.h"
22
23
23
24
using namespace llvm ;
24
25
26
+ DenseMap<Value *, Value *> ValueToBasePtr;
27
+
25
28
static bool tryToImproveAlign (
26
29
const DataLayout &DL, Instruction *I,
27
30
function_ref<Align(Value *PtrOp, Align OldAlign, Align PrefAlign)> Fn) {
@@ -36,10 +39,31 @@ static bool tryToImproveAlign(
36
39
return true ;
37
40
}
38
41
}
42
+
39
43
// TODO: Also handle memory intrinsics.
40
44
return false ;
41
45
}
42
46
47
+ static bool needEnforceAlignment (Value *PtrOp, Instruction *I, Align PrefAlign,
48
+ const DataLayout &DL) {
49
+ auto it = ValueToBasePtr.find (PtrOp);
50
+ if (it != ValueToBasePtr.end ()) {
51
+ Value *V = it->second ;
52
+ Align CurrentAlign;
53
+ if (auto Alloca = dyn_cast<AllocaInst>(V))
54
+ CurrentAlign = Alloca->getAlign ();
55
+ if (auto GO = dyn_cast<GlobalObject>(V))
56
+ CurrentAlign = GO->getPointerAlignment (DL);
57
+
58
+ if (PrefAlign <= CurrentAlign) {
59
+ setLoadStoreAlignment (I, CurrentAlign);
60
+ return false ;
61
+ }
62
+ }
63
+
64
+ return true ;
65
+ }
66
+
43
67
bool inferAlignment (Function &F, AssumptionCache &AC, DominatorTree &DT) {
44
68
const DataLayout &DL = F.getDataLayout ();
45
69
bool Changed = false ;
@@ -50,9 +74,15 @@ bool inferAlignment(Function &F, AssumptionCache &AC, DominatorTree &DT) {
50
74
for (Instruction &I : BB) {
51
75
Changed |= tryToImproveAlign (
52
76
DL, &I, [&](Value *PtrOp, Align OldAlign, Align PrefAlign) {
53
- if (PrefAlign > OldAlign)
54
- return std::max (OldAlign,
55
- tryEnforceAlignment (PtrOp, PrefAlign, DL));
77
+ if (needEnforceAlignment (PtrOp, &I, PrefAlign, DL) &&
78
+ PrefAlign > OldAlign) {
79
+ Align NewAlign = tryEnforceAlignment (PtrOp, PrefAlign, DL);
80
+ if (NewAlign > OldAlign) {
81
+ ValueToBasePtr[PtrOp] = PtrOp->stripPointerCasts ();
82
+ return NewAlign;
83
+ }
84
+ }
85
+
56
86
return OldAlign;
57
87
});
58
88
}
0 commit comments