[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / Transforms / EarlyCSE / noalias-addrspace.ll
blob0a001b55f684cf2be0acae82e789cf24c33d05df
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2 ; RUN: opt -passes='early-cse<memssa>' -S < %s | FileCheck %s
4 declare void @use(i1)
5 declare void @use.ptr(ptr) memory(read)
7 define void @load_first_noalias_addrspace(ptr %p) {
8 ; CHECK-LABEL: define void @load_first_noalias_addrspace(
9 ; CHECK-SAME: ptr [[P:%.*]]) {
10 ; CHECK-NEXT:    [[V1:%.*]] = load ptr, ptr [[P]], align 8, !nonnull [[META0:![0-9]+]], !noundef [[META0]], !noalias.addrspace [[META1:![0-9]+]]
11 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
12 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
13 ; CHECK-NEXT:    ret void
15   %v1 = load ptr, ptr %p, !nonnull !{}, !noundef !{}, !noalias.addrspace !0
16   call void @use.ptr(ptr %v1)
17   %v2 = load ptr, ptr %p
18   call void @use.ptr(ptr %v2)
19   ret void
22 define void @load_both_same_noalias_addrspace(ptr %p) {
23 ; CHECK-LABEL: define void @load_both_same_noalias_addrspace(
24 ; CHECK-SAME: ptr [[P:%.*]]) {
25 ; CHECK-NEXT:    [[V1:%.*]] = load ptr, ptr [[P]], align 8, !nonnull [[META0]], !noundef [[META0]], !noalias.addrspace [[META1]]
26 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
27 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
28 ; CHECK-NEXT:    ret void
30   %v1 = load ptr, ptr %p, !nonnull !{}, !noundef !{}, !noalias.addrspace !0
31   call void @use.ptr(ptr %v1)
32   %v2 = load ptr, ptr %p, !noalias.addrspace !0
33   call void @use.ptr(ptr %v2)
34   ret void
37 define void @load_both_disjoint_noalias_addrspace(ptr %p) {
38 ; CHECK-LABEL: define void @load_both_disjoint_noalias_addrspace(
39 ; CHECK-SAME: ptr [[P:%.*]]) {
40 ; CHECK-NEXT:    [[V1:%.*]] = load ptr, ptr [[P]], align 8, !nonnull [[META0]], !noundef [[META0]], !noalias.addrspace [[META1]]
41 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
42 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
43 ; CHECK-NEXT:    ret void
45   %v1 = load ptr, ptr %p, !nonnull !{}, !noundef !{}, !noalias.addrspace !0
46   call void @use.ptr(ptr %v1)
47   %v2 = load ptr, ptr %p, !noalias.addrspace !1
48   call void @use.ptr(ptr %v2)
49   ret void
52 define void @load_both_overlap_noalias_addrspace(ptr %p) {
53 ; CHECK-LABEL: define void @load_both_overlap_noalias_addrspace(
54 ; CHECK-SAME: ptr [[P:%.*]]) {
55 ; CHECK-NEXT:    [[V1:%.*]] = load ptr, ptr [[P]], align 8, !nonnull [[META0]], !noundef [[META0]], !noalias.addrspace [[META1]]
56 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
57 ; CHECK-NEXT:    call void @use.ptr(ptr [[V1]])
58 ; CHECK-NEXT:    ret void
60   %v1 = load ptr, ptr %p, !nonnull !{}, !noundef !{}, !noalias.addrspace !0
61   call void @use.ptr(ptr %v1)
62   %v2 = load ptr, ptr %p, !noalias.addrspace !2
63   call void @use.ptr(ptr %v2)
64   ret void
67 !0 = !{i32 5, i32 6}
68 !1 = !{i32 7, i32 8}
69 !2 = !{i32 5, i32 7}
71 ; CHECK: [[META0]] = !{}
72 ; CHECK: [[META1]] = !{i32 5, i32 6}