
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: https://github.com/llvm/llvm-project/pull/117716
59 lines
1.8 KiB
LLVM
59 lines
1.8 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
|
|
; RUN: opt -passes=newgvn -S < %s | FileCheck %s
|
|
|
|
define i32 @test1(ptr %p, ptr %q) {
|
|
; CHECK-LABEL: define i32 @test1(
|
|
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
|
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !noalias [[META0:![0-9]+]]
|
|
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
|
; CHECK-NEXT: ret i32 [[C]]
|
|
;
|
|
%a = load i32, ptr %p, !noalias !3
|
|
%b = load i32, ptr %p
|
|
%c = add i32 %a, %b
|
|
ret i32 %c
|
|
}
|
|
|
|
define i32 @test2(ptr %p, ptr %q) {
|
|
; CHECK-LABEL: define i32 @test2(
|
|
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
|
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META0]]
|
|
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
|
; CHECK-NEXT: ret i32 [[C]]
|
|
;
|
|
%a = load i32, ptr %p, !alias.scope !3
|
|
%b = load i32, ptr %p, !alias.scope !3
|
|
%c = add i32 %a, %b
|
|
ret i32 %c
|
|
}
|
|
|
|
define i32 @test3(ptr %p, ptr %q) {
|
|
; CHECK-LABEL: define i32 @test3(
|
|
; CHECK-SAME: ptr [[P:%.*]], ptr [[Q:%.*]]) {
|
|
; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META3:![0-9]+]]
|
|
; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]]
|
|
; CHECK-NEXT: ret i32 [[C]]
|
|
;
|
|
%a = load i32, ptr %p, !alias.scope !4
|
|
%b = load i32, ptr %p, !alias.scope !5
|
|
%c = add i32 %a, %b
|
|
ret i32 %c
|
|
}
|
|
|
|
declare i32 @foo(ptr) readonly
|
|
|
|
!0 = distinct !{!0, !2, !"callee0: %a"}
|
|
!1 = distinct !{!1, !2, !"callee0: %b"}
|
|
!2 = distinct !{!2, !"callee0"}
|
|
|
|
!3 = !{!0}
|
|
!4 = !{!1}
|
|
!5 = !{!0, !1}
|
|
;.
|
|
; CHECK: [[META0]] = !{[[META1:![0-9]+]]}
|
|
; CHECK: [[META1]] = distinct !{[[META1]], [[META2:![0-9]+]], !"callee0: %a"}
|
|
; CHECK: [[META2]] = distinct !{[[META2]], !"callee0"}
|
|
; CHECK: [[META3]] = !{[[META4:![0-9]+]]}
|
|
; CHECK: [[META4]] = distinct !{[[META4]], [[META2]], !"callee0: %b"}
|
|
;.
|