Skip to content

Commit 903d6d9

Browse files
committed
[EarlyCSE] Rematerialize alignment assumption.
1 parent 96ba9d3 commit 903d6d9

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

llvm/lib/Transforms/Scalar/EarlyCSE.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "llvm/IR/Constants.h"
3232
#include "llvm/IR/Dominators.h"
3333
#include "llvm/IR/Function.h"
34+
#include "llvm/IR/IRBuilder.h"
3435
#include "llvm/IR/InstrTypes.h"
3536
#include "llvm/IR/Instruction.h"
3637
#include "llvm/IR/Instructions.h"
@@ -1588,6 +1589,18 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
15881589
if (InVal.IsLoad)
15891590
if (auto *I = dyn_cast<Instruction>(Op))
15901591
combineMetadataForCSE(I, &Inst, false);
1592+
1593+
// If the load has align metadata, preserve it via an alignment
1594+
// assumption. Note that this doesn't use salavageKnowledge, as we need
1595+
// to create the assumption for the value we replaced the load with.
1596+
if (auto *AlignMD = Inst.getMetadata(LLVMContext::MD_align)) {
1597+
auto *A = mdconst::extract<ConstantInt>(AlignMD->getOperand(0));
1598+
if (Op->getPointerAlignment(SQ.DL).value() % A->getZExtValue() != 0) {
1599+
IRBuilder B(&Inst);
1600+
B.CreateAlignmentAssumption(SQ.DL, Op, A);
1601+
}
1602+
}
1603+
15911604
if (!Inst.use_empty())
15921605
Inst.replaceAllUsesWith(Op);
15931606
salvageKnowledge(&Inst, &AC);

llvm/test/Transforms/EarlyCSE/materialize-align-assumptions.ll

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ define ptr @align_replacement_does_not_have_align_metadata(ptr noalias %p) {
1010
; CHECK-NEXT: call void @foo(ptr [[L_1]])
1111
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[L_1]], i64 4
1212
; CHECK-NEXT: store ptr [[GEP]], ptr [[P]], align 8
13+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[GEP]], i64 4) ]
1314
; CHECK-NEXT: ret ptr [[GEP]]
1415
;
1516
%l.1 = load ptr, ptr %p, align 8
@@ -27,6 +28,7 @@ define ptr @align_replacement_does_not_have_align_metadata2(ptr noalias %p) {
2728
; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8
2829
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[L_1]], i64 4
2930
; CHECK-NEXT: store ptr [[GEP]], ptr [[P]], align 8
31+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[GEP]], i64 4) ]
3032
; CHECK-NEXT: ret ptr [[GEP]]
3133
;
3234
%l.1 = load ptr, ptr %p, align 8
@@ -54,6 +56,7 @@ define ptr @align_replacement_has_smaller_alignment(ptr noalias %p) {
5456
; CHECK-SAME: ptr noalias [[P:%.*]]) {
5557
; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0]]
5658
; CHECK-NEXT: call void @foo(ptr [[L_1]])
59+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[L_1]], i64 8) ]
5760
; CHECK-NEXT: ret ptr [[L_1]]
5861
;
5962
%l.1 = load ptr, ptr %p, align 8, !align !0

0 commit comments

Comments
 (0)