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 3 4declare void @use(i1) 5declare void @use.ptr(ptr) memory(read) 6 7define 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 14; 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 20} 21 22define 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 29; 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 35} 36 37define 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 44; 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 50} 51 52define 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 59; 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 65} 66 67!0 = !{i32 5, i32 6} 68!1 = !{i32 7, i32 8} 69!2 = !{i32 5, i32 7} 70;. 71; CHECK: [[META0]] = !{} 72; CHECK: [[META1]] = !{i32 5, i32 6} 73;. 74