1 ; RUN: opt -S -basicaa -licm < %s | FileCheck %s 2 ; RUN: opt -aa-pipeline=basic-aa -passes='loop-simplify,require<aa>,require<targetir>,require<scalar-evolution>,loop(simplify-cfg,licm)' -S < %s | FileCheck %s 3 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4 target triple = "x86_64-unknown-linux-gnu" 5 6 ; Make sure the basic alloca pointer hoisting works: 7 ; CHECK-LABEL: @test1 8 ; CHECK: load i32, i32* %c, align 4 9 ; CHECK: for.body: 10 11 ; Function Attrs: nounwind uwtable 12 define void @test1(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 { 13 entry: 14 %cmp6 = icmp sgt i32 %n, 0 15 %c = alloca i32 16 br i1 %cmp6, label %for.body, label %for.end 17 18 for.body: ; preds = %entry, %for.inc 19 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] 20 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 21 %0 = load i32, i32* %arrayidx, align 4 22 %cmp1 = icmp sgt i32 %0, 0 23 br i1 %cmp1, label %if.then, label %for.inc 24 25 if.then: ; preds = %for.body 26 %1 = load i32, i32* %c, align 4 27 %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv 28 %2 = load i32, i32* %arrayidx3, align 4 29 %mul = mul nsw i32 %2, %1 30 store i32 %mul, i32* %arrayidx, align 4 31 br label %for.inc 32 33 for.inc: ; preds = %for.body, %if.then 34 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 35 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 36 %exitcond = icmp eq i32 %lftr.wideiv, %n 37 br i1 %exitcond, label %for.end, label %for.body 38 39 for.end: ; preds = %for.inc, %entry 40 ret void 41 } 42 43 ; Make sure the basic alloca pointer hoisting works through a bitcast to a 44 ; pointer to a smaller type: 45 ; CHECK-LABEL: @test2 46 ; CHECK: load i32, i32* %c, align 4 47 ; CHECK: for.body: 48 49 ; Function Attrs: nounwind uwtable 50 define void @test2(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 { 51 entry: 52 %cmp6 = icmp sgt i32 %n, 0 53 %ca = alloca i64 54 %c = bitcast i64* %ca to i32* 55 br i1 %cmp6, label %for.body, label %for.end 56 57 for.body: ; preds = %entry, %for.inc 58 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] 59 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 60 %0 = load i32, i32* %arrayidx, align 4 61 %cmp1 = icmp sgt i32 %0, 0 62 br i1 %cmp1, label %if.then, label %for.inc 63 64 if.then: ; preds = %for.body 65 %1 = load i32, i32* %c, align 4 66 %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv 67 %2 = load i32, i32* %arrayidx3, align 4 68 %mul = mul nsw i32 %2, %1 69 store i32 %mul, i32* %arrayidx, align 4 70 br label %for.inc 71 72 for.inc: ; preds = %for.body, %if.then 73 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 74 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 75 %exitcond = icmp eq i32 %lftr.wideiv, %n 76 br i1 %exitcond, label %for.end, label %for.body 77 78 for.end: ; preds = %for.inc, %entry 79 ret void 80 } 81 82 ; Make sure the basic alloca pointer hoisting works through an addrspacecast 83 ; CHECK-LABEL: @test2_addrspacecast 84 ; CHECK: load i32, i32 addrspace(1)* %c, align 4 85 ; CHECK: for.body: 86 87 ; Function Attrs: nounwind uwtable 88 define void @test2_addrspacecast(i32 addrspace(1)* nocapture %a, i32 addrspace(1)* nocapture readonly %b, i32 %n) #0 { 89 entry: 90 %cmp6 = icmp sgt i32 %n, 0 91 %ca = alloca i64 92 %c = addrspacecast i64* %ca to i32 addrspace(1)* 93 br i1 %cmp6, label %for.body, label %for.end 94 95 for.body: ; preds = %entry, %for.inc 96 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] 97 %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %a, i64 %indvars.iv 98 %0 = load i32, i32 addrspace(1)* %arrayidx, align 4 99 %cmp1 = icmp sgt i32 %0, 0 100 br i1 %cmp1, label %if.then, label %for.inc 101 102 if.then: ; preds = %for.body 103 %1 = load i32, i32 addrspace(1)* %c, align 4 104 %arrayidx3 = getelementptr inbounds i32, i32 addrspace(1)* %b, i64 %indvars.iv 105 %2 = load i32, i32 addrspace(1)* %arrayidx3, align 4 106 %mul = mul nsw i32 %2, %1 107 store i32 %mul, i32 addrspace(1)* %arrayidx, align 4 108 br label %for.inc 109 110 for.inc: ; preds = %for.body, %if.then 111 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 112 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 113 %exitcond = icmp eq i32 %lftr.wideiv, %n 114 br i1 %exitcond, label %for.end, label %for.body 115 116 for.end: ; preds = %for.inc, %entry 117 ret void 118 } 119 120 ; Make sure the basic alloca pointer hoisting works through a bitcast to a 121 ; pointer to a smaller type (where the bitcast also needs to be hoisted): 122 ; CHECK-LABEL: @test3 123 ; CHECK: load i32, i32* %c, align 4 124 ; CHECK: for.body: 125 126 ; Function Attrs: nounwind uwtable 127 define void @test3(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 { 128 entry: 129 %cmp6 = icmp sgt i32 %n, 0 130 %ca = alloca i64 131 br i1 %cmp6, label %for.body, label %for.end 132 133 for.body: ; preds = %entry, %for.inc 134 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] 135 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 136 %0 = load i32, i32* %arrayidx, align 4 137 %cmp1 = icmp sgt i32 %0, 0 138 br i1 %cmp1, label %if.then, label %for.inc 139 140 if.then: ; preds = %for.body 141 %c = bitcast i64* %ca to i32* 142 %1 = load i32, i32* %c, align 4 143 %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv 144 %2 = load i32, i32* %arrayidx3, align 4 145 %mul = mul nsw i32 %2, %1 146 store i32 %mul, i32* %arrayidx, align 4 147 br label %for.inc 148 149 for.inc: ; preds = %for.body, %if.then 150 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 151 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 152 %exitcond = icmp eq i32 %lftr.wideiv, %n 153 br i1 %exitcond, label %for.end, label %for.body 154 155 for.end: ; preds = %for.inc, %entry 156 ret void 157 } 158 159 ; Make sure the basic alloca pointer hoisting does not happen through a bitcast 160 ; to a pointer to a larger type: 161 ; CHECK-LABEL: @test4 162 ; CHECK: for.body: 163 ; CHECK: load i32, i32* %c, align 4 164 165 ; Function Attrs: nounwind uwtable 166 define void @test4(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 { 167 entry: 168 %cmp6 = icmp sgt i32 %n, 0 169 %ca = alloca i16 170 %c = bitcast i16* %ca to i32* 171 br i1 %cmp6, label %for.body, label %for.end 172 173 for.body: ; preds = %entry, %for.inc 174 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] 175 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 176 %0 = load i32, i32* %arrayidx, align 4 177 %cmp1 = icmp sgt i32 %0, 0 178 br i1 %cmp1, label %if.then, label %for.inc 179 180 if.then: ; preds = %for.body 181 %1 = load i32, i32* %c, align 4 182 %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv 183 %2 = load i32, i32* %arrayidx3, align 4 184 %mul = mul nsw i32 %2, %1 185 store i32 %mul, i32* %arrayidx, align 4 186 br label %for.inc 187 188 for.inc: ; preds = %for.body, %if.then 189 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 190 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 191 %exitcond = icmp eq i32 %lftr.wideiv, %n 192 br i1 %exitcond, label %for.end, label %for.body 193 194 for.end: ; preds = %for.inc, %entry 195 ret void 196 } 197 198 ; Don't crash on bitcasts to unsized types. 199 ; CHECK-LABEL: @test5 200 ; CHECK: for.body: 201 ; CHECK: load i32, i32* %c, align 4 202 203 %atype = type opaque 204 205 ; Function Attrs: nounwind uwtable 206 define void @test5(i32* nocapture %a, i32* nocapture readonly %b, i32 %n) #0 { 207 entry: 208 %cmp6 = icmp sgt i32 %n, 0 209 %ca = alloca i16 210 %cab = bitcast i16* %ca to %atype* 211 %c = bitcast %atype* %cab to i32* 212 br i1 %cmp6, label %for.body, label %for.end 213 214 for.body: ; preds = %entry, %for.inc 215 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 0, %entry ] 216 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 217 %0 = load i32, i32* %arrayidx, align 4 218 %cmp1 = icmp sgt i32 %0, 0 219 br i1 %cmp1, label %if.then, label %for.inc 220 221 if.then: ; preds = %for.body 222 %1 = load i32, i32* %c, align 4 223 %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv 224 %2 = load i32, i32* %arrayidx3, align 4 225 %mul = mul nsw i32 %2, %1 226 store i32 %mul, i32* %arrayidx, align 4 227 br label %for.inc 228 229 for.inc: ; preds = %for.body, %if.then 230 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 231 %lftr.wideiv = trunc i64 %indvars.iv.next to i32 232 %exitcond = icmp eq i32 %lftr.wideiv, %n 233 br i1 %exitcond, label %for.end, label %for.body 234 235 for.end: ; preds = %for.inc, %entry 236 ret void 237 } 238 239 attributes #0 = { nounwind uwtable } 240 241