Skip to content

Commit 31a095c

Browse files
committed
!fixup check noundef
1 parent 3ddc96f commit 31a095c

File tree

2 files changed

+39
-16
lines changed

2 files changed

+39
-16
lines changed

llvm/lib/Transforms/Scalar/EarlyCSE.cpp

+12-8
Original file line numberDiff line numberDiff line change
@@ -1590,14 +1590,18 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
15901590
if (auto *I = dyn_cast<Instruction>(Op))
15911591
combineMetadataForCSE(I, &Inst, false);
15921592

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);
1593+
// If the load has align and noundef metadata, preserve it via an
1594+
// alignment assumption. Note that this doesn't use salavageKnowledge,
1595+
// as we need to create the assumption for the value we replaced the
1596+
// load with.
1597+
if (Inst.hasMetadata(LLVMContext::MD_noundef)) {
1598+
if (auto *AlignMD = Inst.getMetadata(LLVMContext::MD_align)) {
1599+
auto *A = mdconst::extract<ConstantInt>(AlignMD->getOperand(0));
1600+
if (Op->getPointerAlignment(SQ.DL).value() % A->getZExtValue() !=
1601+
0) {
1602+
IRBuilder B(&Inst);
1603+
B.CreateAlignmentAssumption(SQ.DL, Op, A);
1604+
}
16011605
}
16021606
}
16031607

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

+27-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,24 @@
33

44
declare void @foo(ptr)
55

6+
define ptr @align_replacement_does_not_have_align_metadata_missing_noundef(ptr noalias %p) {
7+
; CHECK-LABEL: define ptr @align_replacement_does_not_have_align_metadata_missing_noundef(
8+
; CHECK-SAME: ptr noalias [[P:%.*]]) {
9+
; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8
10+
; CHECK-NEXT: call void @foo(ptr [[L_1]])
11+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[L_1]], i64 4
12+
; CHECK-NEXT: store ptr [[GEP]], ptr [[P]], align 8
13+
; CHECK-NEXT: ret ptr [[GEP]]
14+
;
15+
%l.1 = load ptr, ptr %p, align 8
16+
call void @foo(ptr %l.1)
17+
%l.2 = load ptr, ptr %p, align 8
18+
%gep = getelementptr i8, ptr %l.2, i64 4
19+
store ptr %gep, ptr %p, align 8
20+
%l.3 = load ptr, ptr %p, align 8, !align !0
21+
ret ptr %l.3
22+
}
23+
624
define ptr @align_replacement_does_not_have_align_metadata(ptr noalias %p) {
725
; CHECK-LABEL: define ptr @align_replacement_does_not_have_align_metadata(
826
; CHECK-SAME: ptr noalias [[P:%.*]]) {
@@ -18,7 +36,7 @@ define ptr @align_replacement_does_not_have_align_metadata(ptr noalias %p) {
1836
%l.2 = load ptr, ptr %p, align 8
1937
%gep = getelementptr i8, ptr %l.2, i64 4
2038
store ptr %gep, ptr %p, align 8
21-
%l.3 = load ptr, ptr %p, align 8, !align !0
39+
%l.3 = load ptr, ptr %p, align 8, !align !0, !noundef !{}
2240
ret ptr %l.3
2341
}
2442

@@ -34,7 +52,7 @@ define ptr @align_replacement_does_not_have_align_metadata2(ptr noalias %p) {
3452
%l.1 = load ptr, ptr %p, align 8
3553
%gep = getelementptr i8, ptr %l.1, i64 4
3654
store ptr %gep, ptr %p, align 8
37-
%l.2 = load ptr, ptr %p, align 8, !align !0
55+
%l.2 = load ptr, ptr %p, align 8, !align !0, !noundef !{}
3856
ret ptr %l.2
3957
}
4058

@@ -61,7 +79,7 @@ define ptr @align_replacement_has_smaller_alignment(ptr noalias %p) {
6179
;
6280
%l.1 = load ptr, ptr %p, align 8, !align !0
6381
call void @foo(ptr %l.1)
64-
%l.2 = load ptr, ptr %p, align 8, !align !1
82+
%l.2 = load ptr, ptr %p, align 8, !align !1, !noundef !{}
6583
ret ptr %l.2
6684
}
6785

@@ -70,12 +88,12 @@ define ptr @align_replacement_has_larger_alignment(ptr %p) {
7088
; CHECK-SAME: ptr [[P:%.*]]) {
7189
; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8, !align [[META1:![0-9]+]]
7290
; CHECK-NEXT: call void @foo(ptr [[L_1]])
73-
; CHECK-NEXT: [[L_2:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0]]
91+
; CHECK-NEXT: [[L_2:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0]], !noundef [[META2:![0-9]+]]
7492
; CHECK-NEXT: ret ptr [[L_2]]
7593
;
7694
%l.1 = load ptr, ptr %p, align 8, !align !1
7795
call void @foo(ptr %l.1)
78-
%l.2 = load ptr, ptr %p, align 8, !align !0
96+
%l.2 = load ptr, ptr %p, align 8, !align !0, !noundef !{}
7997
ret ptr %l.2
8098
}
8199

@@ -84,12 +102,12 @@ define ptr @align_1(ptr %p) {
84102
; CHECK-SAME: ptr [[P:%.*]]) {
85103
; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8
86104
; CHECK-NEXT: call void @foo(ptr [[L_1]])
87-
; CHECK-NEXT: [[L_2:%.*]] = load ptr, ptr [[P]], align 8, !align [[META2:![0-9]+]]
105+
; CHECK-NEXT: [[L_2:%.*]] = load ptr, ptr [[P]], align 8, !align [[META3:![0-9]+]], !noundef [[META2]]
88106
; CHECK-NEXT: ret ptr [[L_2]]
89107
;
90108
%l.1 = load ptr, ptr %p, align 8
91109
call void @foo(ptr %l.1)
92-
%l.2 = load ptr, ptr %p, align 8, !align !2
110+
%l.2 = load ptr, ptr %p, align 8, !align !2, !noundef !{}
93111
ret ptr %l.2
94112
}
95113

@@ -99,5 +117,6 @@ define ptr @align_1(ptr %p) {
99117
;.
100118
; CHECK: [[META0]] = !{i64 4}
101119
; CHECK: [[META1]] = !{i64 8}
102-
; CHECK: [[META2]] = !{i64 1}
120+
; CHECK: [[META2]] = !{}
121+
; CHECK: [[META3]] = !{i64 1}
103122
;.

0 commit comments

Comments
 (0)