Skip to content

Commit 46a0857

Browse files
authored
[Local] Only intersect alias.scope,noalias & parallel_loop if inst moves (#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: #116220 Same as #115868, but for !alias.scope, !noalias and !mem.parallel_loop_access. PR: #117716
1 parent 0719b6d commit 46a0857

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
@@ -3330,11 +3330,13 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
33303330
K->setMetadata(Kind, MDNode::getMostGenericTBAA(JMD, KMD));
33313331
break;
33323332
case LLVMContext::MD_alias_scope:
3333-
K->setMetadata(Kind, MDNode::getMostGenericAliasScope(JMD, KMD));
3333+
if (DoesKMove)
3334+
K->setMetadata(Kind, MDNode::getMostGenericAliasScope(JMD, KMD));
33343335
break;
33353336
case LLVMContext::MD_noalias:
33363337
case LLVMContext::MD_mem_parallel_loop_access:
3337-
K->setMetadata(Kind, MDNode::intersect(JMD, KMD));
3338+
if (DoesKMove)
3339+
K->setMetadata(Kind, MDNode::intersect(JMD, KMD));
33383340
break;
33393341
case LLVMContext::MD_access_group:
33403342
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]]
@@ -322,5 +322,8 @@ entry:
322322
; CHECK: [[META7]] = !{i32 1}
323323
; CHECK: [[META8]] = !{i64 8}
324324
; CHECK: [[ACC_GRP9]] = distinct !{}
325-
; CHECK: [[ACC_GRP10]] = distinct !{}
325+
; CHECK: [[META10]] = !{[[META11:![0-9]+]]}
326+
; CHECK: [[META11]] = distinct !{[[META11]], [[META12:![0-9]+]]}
327+
; CHECK: [[META12]] = distinct !{[[META12]]}
328+
; CHECK: [[ACC_GRP13]] = distinct !{}
326329
;.

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)