1; RUN: opt -passes=print-alias-sets -S -o - < %s 2>&1 | FileCheck %s 2 3@s = global i8 1, align 1 4@d = global i8 2, align 1 5 6; CHECK: Alias sets for function 'test_alloca_argmemonly': 7; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 3 pointer values. 8; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %a, LocationSize::precise(1)) 9; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Memory locations: (ptr %d, unknown before-or-after), (ptr %s, unknown before-or-after) 10define void @test_alloca_argmemonly(ptr %s, ptr %d) { 11entry: 12 %a = alloca i8, align 1 13 store i8 1, ptr %a, align 1 14 call void @my_memcpy(ptr %d, ptr %s, i64 1) 15 ret void 16} 17 18; CHECK: Alias sets for function 'test_readonly_arg' 19; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 2 pointer values. 20; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %d, unknown before-or-after) 21; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Ref Memory locations: (ptr %s, unknown before-or-after), (ptr %s, LocationSize::precise(1)) 22define i8 @test_readonly_arg(ptr noalias %s, ptr noalias %d) { 23entry: 24 call void @my_memcpy(ptr %d, ptr %s, i64 1) 25 %ret = load i8, ptr %s 26 ret i8 %ret 27} 28 29; CHECK: Alias sets for function 'test_noalias_argmemonly': 30; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 3 pointer values. 31; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %a, LocationSize::precise(1)) 32; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Memory locations: (ptr %d, unknown before-or-after), (ptr %s, unknown before-or-after) 33define void @test_noalias_argmemonly(ptr noalias %a, ptr %s, ptr %d) { 34entry: 35 store i8 1, ptr %a, align 1 36 call void @my_memmove(ptr %d, ptr %s, i64 1) 37 ret void 38} 39 40; CHECK: Alias sets for function 'test5': 41; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 2 pointer values. 42; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Memory locations: (ptr %a, LocationSize::precise(1)), (ptr %a, unknown before-or-after) 43; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %b, unknown before-or-after), (ptr %b, LocationSize::precise(1)) 44define void @test5(ptr noalias %a, ptr noalias %b) { 45entry: 46 store i8 1, ptr %a, align 1 47 call void @my_memcpy(ptr %b, ptr %a, i64 1) 48 store i8 1, ptr %b, align 1 49 ret void 50} 51 52; CHECK: Alias sets for function 'test_argcollapse': 53; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 2 pointer values. 54; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Memory locations: (ptr %a, LocationSize::precise(1)), (ptr %a, unknown before-or-after) 55; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Memory locations: (ptr %b, unknown before-or-after), (ptr %b, LocationSize::precise(1)) 56define void @test_argcollapse(ptr noalias %a, ptr noalias %b) { 57entry: 58 store i8 1, ptr %a, align 1 59 call void @my_memmove(ptr %b, ptr %a, i64 1) 60 store i8 1, ptr %b, align 1 61 ret void 62} 63 64; CHECK: Alias sets for function 'test_memcpy1': 65; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 2 pointer values. 66; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Memory locations: (ptr %b, unknown before-or-after) 67; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Memory locations: (ptr %a, unknown before-or-after) 68define void @test_memcpy1(ptr noalias %a, ptr noalias %b) { 69entry: 70 call void @my_memcpy(ptr %b, ptr %a, i64 1) 71 call void @my_memcpy(ptr %a, ptr %b, i64 1) 72 ret void 73} 74 75; CHECK: Alias sets for function 'test_memset1': 76; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 1 pointer values. 77; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %a, unknown before-or-after) 78define void @test_memset1() { 79entry: 80 %a = alloca i8, align 1 81 call void @my_memset(ptr %a, i8 0, i64 1) 82 ret void 83} 84 85; CHECK: Alias sets for function 'test_memset2': 86; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 1 pointer values. 87; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %a, unknown before-or-after) 88define void @test_memset2(ptr %a) { 89entry: 90 call void @my_memset(ptr %a, i8 0, i64 1) 91 ret void 92} 93 94; CHECK: Alias sets for function 'test_memset3': 95; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 2 pointer values. 96; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod Memory locations: (ptr %a, unknown before-or-after), (ptr %b, unknown before-or-after) 97define void @test_memset3(ptr %a, ptr %b) { 98entry: 99 call void @my_memset(ptr %a, i8 0, i64 1) 100 call void @my_memset(ptr %b, i8 0, i64 1) 101 ret void 102} 103 104;; PICKUP HERE 105 106; CHECK: Alias sets for function 'test_memset4': 107; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 2 pointer values. 108; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %a, unknown before-or-after) 109; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Memory locations: (ptr %b, unknown before-or-after) 110define void @test_memset4(ptr noalias %a, ptr noalias %b) { 111entry: 112 call void @my_memset(ptr %a, i8 0, i64 1) 113 call void @my_memset(ptr %b, i8 0, i64 1) 114 ret void 115} 116 117declare void @my_memset(ptr nocapture writeonly, i8, i64) argmemonly 118declare void @my_memcpy(ptr nocapture writeonly, ptr nocapture readonly, i64) argmemonly 119declare void @my_memmove(ptr nocapture, ptr nocapture readonly, i64) argmemonly 120 121 122; CHECK: Alias sets for function 'test_attribute_intersect': 123; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 1 pointer values. 124; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Ref Memory locations: (ptr %a, LocationSize::precise(1)) 125define i8 @test_attribute_intersect(ptr noalias %a) { 126entry: 127 ;; This call is effectively readnone since the argument is readonly 128 ;; and the function is declared writeonly. 129 call void @attribute_intersect(ptr %a) 130 %val = load i8, ptr %a 131 ret i8 %val 132} 133 134declare void @attribute_intersect(ptr readonly) argmemonly writeonly 135 136