1; RUN: opt < %s -basic-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s 2 3; getelementptr 4 5; CHECK-LABEL: gep_alloca_const_offset_1 6; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 7; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2 8; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 9define void @gep_alloca_const_offset_1() { 10 %alloc = alloca <vscale x 4 x i32> 11 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0 12 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1 13 ret void 14} 15 16; CHECK-LABEL: gep_alloca_const_offset_2 17; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 18; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2 19; TODO: AliasResult for gep1,gep2 can be improved as MustAlias 20; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 21define void @gep_alloca_const_offset_2() { 22 %alloc = alloca <vscale x 4 x i32> 23 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1 24 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 1 25 ret void 26} 27 28; CHECK-LABEL: gep_alloca_const_offset_3 29; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 30; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, i32* %gep2 31; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, i32* %gep2 32define void @gep_alloca_const_offset_3() { 33 %alloc = alloca <vscale x 4 x i32> 34 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0 35 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0, i64 1 36 ret void 37} 38 39; CHECK-LABEL: gep_alloca_const_offset_4 40; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 41; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, i32* %gep2 42; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %gep1, i32* %gep2 43define void @gep_alloca_const_offset_4() { 44 %alloc = alloca <vscale x 4 x i32> 45 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0 46 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 0, i64 0 47 ret void 48} 49 50; CHECK-LABEL: gep_alloca_symbolic_offset 51; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1 52; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2 53; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 54define void @gep_alloca_symbolic_offset(i64 %idx1, i64 %idx2) { 55 %alloc = alloca <vscale x 4 x i32> 56 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 %idx1 57 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %alloc, i64 %idx2 58 ret void 59} 60 61; CHECK-LABEL: gep_same_base_const_offset 62; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1 63; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep2 64; TODO: AliasResult for gep1,gep2 can be improved as NoAlias 65; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2 66define void @gep_same_base_const_offset(<vscale x 4 x i32>* %p) { 67 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0 68 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 1 69 ret void 70} 71 72; CHECK-LABEL: gep_same_base_symbolic_offset 73; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p 74; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p 75; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 76define void @gep_same_base_symbolic_offset(<vscale x 4 x i32>* %p, i64 %idx1, i64 %idx2) { 77 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 %idx1 78 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 %idx2 79 ret void 80} 81 82; CHECK-LABEL: gep_different_base_const_offset 83; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p1 84; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p2 85; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p1, <vscale x 4 x i32>* %p2 86; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p2 87; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p1 88; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2 89define void @gep_different_base_const_offset(<vscale x 4 x i32>* noalias %p1, <vscale x 4 x i32>* noalias %p2) { 90 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p1, i64 1 91 %gep2 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p2, i64 1 92 ret void 93} 94 95; getelementptr + bitcast 96 97; CHECK-LABEL: gep_bitcast_1 98; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %p, i32* %p2 99; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1 100; CHECK-DAG: MayAlias: i32* %gep1, i32* %p2 101; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep2 102; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2 103; CHECK-DAG: NoAlias: i32* %gep2, i32* %p2 104define void @gep_bitcast_1(<vscale x 4 x i32>* %p) { 105 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0 106 %p2 = bitcast <vscale x 4 x i32>* %p to i32* 107 %gep2 = getelementptr i32, i32* %p2, i64 4 108 ret void 109} 110 111; CHECK-LABEL: gep_bitcast_2 112; CHECK-DAG: MustAlias: <vscale x 4 x float>* %p2, <vscale x 4 x i32>* %p 113; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep1 114; CHECK-DAG: MayAlias: <vscale x 4 x float>* %p2, i32* %gep1 115; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, float* %gep2 116; CHECK-DAG: MayAlias: float* %gep2, i32* %gep1 117; CHECK-DAG: MayAlias: <vscale x 4 x float>* %p2, float* %gep2 118define void @gep_bitcast_2(<vscale x 4 x i32>* %p) { 119 %gep1 = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 0 120 %p2 = bitcast <vscale x 4 x i32>* %p to <vscale x 4 x float>* 121 %gep2 = getelementptr <vscale x 4 x float>, <vscale x 4 x float>* %p2, i64 1, i64 0 122 ret void 123} 124 125; getelementptr recursion 126 127; CHECK-LABEL: gep_recursion_level_1 128; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a 129; CHECK-DAG: MayAlias: i32* %a, i32* %gep 130; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 131; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep 132; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1 133; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1 134define void @gep_recursion_level_1(i32* %a, <vscale x 4 x i32>* %p) { 135 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2 136 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1 137 ret void 138} 139 140; CHECK-LABEL: gep_recursion_level_1_bitcast 141; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %p, i32* %a 142; CHECK-DAG: MayAlias: i32* %a, i32* %gep 143; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 144; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep 145; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1 146; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1 147define void @gep_recursion_level_1_bitcast(i32* %a) { 148 %p = bitcast i32* %a to <vscale x 4 x i32>* 149 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2 150 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1 151 ret void 152} 153 154; CHECK-LABEL: gep_recursion_level_2 155; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a 156; CHECK-DAG: MayAlias: i32* %a, i32* %gep 157; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 158; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2 159; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep 160; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1 161; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_2 162; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1 163; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_2 164; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_2 165define void @gep_recursion_level_2(i32* %a, <vscale x 4 x i32>* %p) { 166 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2 167 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1 168 %gep_rec_2 = getelementptr i32, i32* %gep_rec_1, i64 1 169 ret void 170} 171 172; CHECK-LABEL: gep_recursion_max_lookup_depth_reached 173; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %a 174; CHECK-DAG: MayAlias: i32* %a, i32* %gep 175; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1 176; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2 177; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_3 178; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_4 179; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_5 180; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_6 181; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep 182; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_1 183; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_2 184; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_3 185; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_4 186; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_5 187; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, i32* %gep_rec_6 188; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_1 189; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_2 190; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_3 191; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_4 192; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_5 193; CHECK-DAG: MayAlias: i32* %gep, i32* %gep_rec_6 194; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_2 195; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_3 196; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_4 197; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_5 198; CHECK-DAG: MayAlias: i32* %gep_rec_1, i32* %gep_rec_6 199; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_3 200; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_4 201; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_5 202; CHECK-DAG: MayAlias: i32* %gep_rec_2, i32* %gep_rec_6 203; CHECK-DAG: MayAlias: i32* %gep_rec_3, i32* %gep_rec_4 204; CHECK-DAG: MayAlias: i32* %gep_rec_3, i32* %gep_rec_5 205; CHECK-DAG: MayAlias: i32* %gep_rec_3, i32* %gep_rec_6 206; CHECK-DAG: MayAlias: i32* %gep_rec_4, i32* %gep_rec_5 207; CHECK-DAG: MayAlias: i32* %gep_rec_4, i32* %gep_rec_6 208; CHECK-DAG: MayAlias: i32* %gep_rec_5, i32* %gep_rec_6 209; GEP max lookup depth was set to 6. 210define void @gep_recursion_max_lookup_depth_reached(i32* %a, <vscale x 4 x i32>* %p) { 211 %gep = getelementptr <vscale x 4 x i32>, <vscale x 4 x i32>* %p, i64 1, i64 2 212 %gep_rec_1 = getelementptr i32, i32* %gep, i64 1 213 %gep_rec_2 = getelementptr i32, i32* %gep_rec_1, i64 1 214 %gep_rec_3 = getelementptr i32, i32* %gep_rec_2, i64 1 215 %gep_rec_4 = getelementptr i32, i32* %gep_rec_3, i64 1 216 %gep_rec_5 = getelementptr i32, i32* %gep_rec_4, i64 1 217 %gep_rec_6 = getelementptr i32, i32* %gep_rec_5, i64 1 218 ret void 219} 220