Skip to content

Commit b4f54c4

Browse files
committed
[EarlyCSE] Rematerialize alignment assumption.
1 parent 8242bd1 commit b4f54c4

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

llvm/lib/Transforms/Scalar/EarlyCSE.cpp

+11
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,16 @@ 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 assumption. Note that this doesn't use salavageKnowledge, as we need to create the assumption for the value we replaced the load with.
1594+
if (auto *AlignMD = Inst.getMetadata(LLVMContext::MD_align)) {
1595+
auto *A = mdconst::extract<ConstantInt>(AlignMD->getOperand(0));
1596+
if (Op->getPointerAlignment(SQ.DL).value() % A->getZExtValue() != 0) {
1597+
IRBuilder B(&Inst);
1598+
B.CreateAlignmentAssumption(SQ.DL, Op, A);
1599+
}
1600+
}
1601+
15911602
if (!Inst.use_empty())
15921603
Inst.replaceAllUsesWith(Op);
15931604
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)