Skip to content

Commit 0e75858

Browse files
committed
[Local] Only intersect alias.scope,noalias & parallel_loop if inst moves (llvm#117716)
Preserve !alias.scope, !noalias and !mem.parallel_loop_access metadata on the replacement instruction, if it does not move. In that case, the program would be UB, if the aliasing property encoded in the metadata does not hold. This makes use of the clarification re aliasing metadata implying UB if the property does not hold: llvm#116220 Same as llvm#115868, but for !alias.scope, !noalias and !mem.parallel_loop_access. PR: llvm#117716 (cherry picked from commit 46a0857)
1 parent fb07da1 commit 0e75858

File tree

5 files changed

+23
-14
lines changed

5 files changed

+23
-14
lines changed

llvm/lib/Transforms/Utils/Local.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3299,11 +3299,13 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
32993299
K->setMetadata(Kind, MDNode::getMostGenericTBAA(JMD, KMD));
33003300
break;
33013301
case LLVMContext::MD_alias_scope:
3302-
K->setMetadata(Kind, MDNode::getMostGenericAliasScope(JMD, KMD));
3302+
if (DoesKMove)
3303+
K->setMetadata(Kind, MDNode::getMostGenericAliasScope(JMD, KMD));
33033304
break;
33043305
case LLVMContext::MD_noalias:
33053306
case LLVMContext::MD_mem_parallel_loop_access:
3306-
K->setMetadata(Kind, MDNode::intersect(JMD, KMD));
3307+
if (DoesKMove)
3308+
K->setMetadata(Kind, MDNode::intersect(JMD, KMD));
33073309
break;
33083310
case LLVMContext::MD_access_group:
33093311
if (DoesKMove)

llvm/test/Transforms/GVN/noalias.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
define i32 @test1(ptr %p, ptr %q) {
44
; CHECK-LABEL: @test1(ptr %p, ptr %q)
5-
; CHECK: load i32, ptr %p
6-
; CHECK-NOT: noalias
5+
; CHECK: load i32, ptr %p, align 4, !noalias ![[SCOPE1:[0-9]+]]
76
; CHECK: %c = add i32 %a, %a
87
%a = load i32, ptr %p, !noalias !3
98
%b = load i32, ptr %p
@@ -13,7 +12,7 @@ define i32 @test1(ptr %p, ptr %q) {
1312

1413
define i32 @test2(ptr %p, ptr %q) {
1514
; CHECK-LABEL: @test2(ptr %p, ptr %q)
16-
; CHECK: load i32, ptr %p, align 4, !alias.scope ![[SCOPE1:[0-9]+]]
15+
; CHECK: load i32, ptr %p, align 4, !alias.scope ![[SCOPE1]]
1716
; CHECK: %c = add i32 %a, %a
1817
%a = load i32, ptr %p, !alias.scope !3
1918
%b = load i32, ptr %p, !alias.scope !3
@@ -32,7 +31,7 @@ define i32 @test3(ptr %p, ptr %q) {
3231
}
3332

3433
; CHECK: ![[SCOPE1]] = !{!{{[0-9]+}}}
35-
; CHECK: ![[SCOPE2]] = !{!{{[0-9]+}}, !{{[0-9]+}}}
34+
; CHECK: ![[SCOPE2]] = !{!{{[0-9]+}}}
3635
declare i32 @foo(ptr) readonly
3736

3837
!0 = distinct !{!0, !2, !"callee0: %a"}

llvm/test/Transforms/InstCombine/loadstore-metadata.ll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,8 @@ entry:
278278
define double @preserve_load_metadata_after_select_transform_metadata_missing_4(ptr %a, ptr %b) {
279279
; CHECK-LABEL: @preserve_load_metadata_after_select_transform_metadata_missing_4(
280280
; CHECK-NEXT: entry:
281-
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[META6]]
282-
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !tbaa [[TBAA0]], !llvm.access.group [[ACC_GRP10:![0-9]+]]
281+
; CHECK-NEXT: [[L_A:%.*]] = load double, ptr [[A:%.*]], align 8, !tbaa [[TBAA0]], !alias.scope [[META3]], !noalias [[META3]], !llvm.access.group [[META6]]
282+
; CHECK-NEXT: [[L_B:%.*]] = load double, ptr [[B:%.*]], align 8, !tbaa [[TBAA0]], !alias.scope [[META10:![0-9]+]], !noalias [[META10]], !llvm.access.group [[ACC_GRP13:![0-9]+]]
283283
; CHECK-NEXT: [[CMP_I:%.*]] = fcmp fast olt double [[L_A]], [[L_B]]
284284
; CHECK-NEXT: [[L_SEL:%.*]] = select i1 [[CMP_I]], double [[L_B]], double [[L_A]]
285285
; CHECK-NEXT: ret double [[L_SEL]]
@@ -318,5 +318,8 @@ entry:
318318
; CHECK: [[META7]] = !{i32 1}
319319
; CHECK: [[META8]] = !{i64 8}
320320
; CHECK: [[ACC_GRP9]] = distinct !{}
321-
; CHECK: [[ACC_GRP10]] = distinct !{}
321+
; CHECK: [[META10]] = !{[[META11:![0-9]+]]}
322+
; CHECK: [[META11]] = distinct !{[[META11]], [[META12:![0-9]+]]}
323+
; CHECK: [[META12]] = distinct !{[[META12]]}
324+
; CHECK: [[ACC_GRP13]] = distinct !{}
322325
;.

llvm/test/Transforms/JumpThreading/thread-loads.ll

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ bb3:
321321
define void @test8(ptr, ptr, ptr) {
322322
; CHECK-LABEL: @test8(
323323
; CHECK-NEXT: ret2:
324-
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[TMP0:%.*]], align 4, !tbaa [[TBAA0]], !range [[RNG4:![0-9]+]], !noundef [[META5:![0-9]+]]
324+
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[TMP0:%.*]], align 4, !tbaa [[TBAA0]], !range [[RNG4:![0-9]+]], !alias.scope [[META5:![0-9]+]], !noalias [[META8:![0-9]+]], !noundef [[META10:![0-9]+]]
325325
; CHECK-NEXT: store i32 [[A]], ptr [[TMP1:%.*]], align 4
326326
; CHECK-NEXT: [[XXX:%.*]] = tail call i32 (...) @f1() #[[ATTR0]]
327327
; CHECK-NEXT: ret void
@@ -698,5 +698,10 @@ right_x:
698698
; CHECK: [[META2]] = !{!"omnipotent char", [[META3:![0-9]+]]}
699699
; CHECK: [[META3]] = !{!"Simple C/C++ TBAA"}
700700
; CHECK: [[RNG4]] = !{i32 0, i32 1}
701-
; CHECK: [[META5]] = !{}
701+
; CHECK: [[META5]] = !{[[META6:![0-9]+]]}
702+
; CHECK: [[META6]] = distinct !{[[META6]], [[META7:![0-9]+]]}
703+
; CHECK: [[META7]] = distinct !{[[META7]]}
704+
; CHECK: [[META8]] = !{[[META9:![0-9]+]]}
705+
; CHECK: [[META9]] = distinct !{[[META9]], [[META7]]}
706+
; CHECK: [[META10]] = !{}
702707
;.

llvm/test/Transforms/NewGVN/noalias.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
define i32 @test1(ptr %p, ptr %q) {
55
; CHECK-LABEL: define i32 @test1(
66
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
7-
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4
7+
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !noalias [[META0:![0-9]+]]
88
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
99
; CHECK-NEXT: ret i32 [[C]]
1010
;
@@ -17,7 +17,7 @@ define i32 @test1(ptr %p, ptr %q) {
1717
define i32 @test2(ptr %p, ptr %q) {
1818
; CHECK-LABEL: define i32 @test2(
1919
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
20-
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META0:![0-9]+]]
20+
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META0]]
2121
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
2222
; CHECK-NEXT: ret i32 [[C]]
2323
;
@@ -53,6 +53,6 @@ declare i32 @foo(ptr) readonly
5353
; CHECK: [[META0]] = !{[[META1:![0-9]+]]}
5454
; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]], !"callee0: %a"}
5555
; CHECK: [[META2]] = distinct !{[[META2]], !"callee0"}
56-
; CHECK: [[META3]] = !{[[META4:![0-9]+]], [[META1]]}
56+
; CHECK: [[META3]] = !{[[META4:![0-9]+]]}
5757
; CHECK: [[META4]] = distinct !{[[META4]], [[META2]], !"callee0: %b"}
5858
;.

0 commit comments

Comments
 (0)