1*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-i64:64-f80:128-n8:16:32:64-S128" 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -alignment-from-assumptions -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes=alignment-from-assumptions -S | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine i32 @foo(i32* nocapture %a) nounwind uwtable readonly { 6*9880d681SAndroid Build Coastguard Workerentry: 7*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 8*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 9*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 10*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 11*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %a, align 4 12*9880d681SAndroid Build Coastguard Worker ret i32 %0 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo 15*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* {{[^,]+}}, align 32 16*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i32 @foo2(i32* nocapture %a) nounwind uwtable readonly { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 22*9880d681SAndroid Build Coastguard Worker %offsetptr = add i64 %ptrint, 24 23*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %offsetptr, 31 24*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 25*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 26*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 2 27*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 28*9880d681SAndroid Build Coastguard Worker ret i32 %0 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo2 31*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* {{[^,]+}}, align 16 32*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine i32 @foo2a(i32* nocapture %a) nounwind uwtable readonly { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 38*9880d681SAndroid Build Coastguard Worker %offsetptr = add i64 %ptrint, 28 39*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %offsetptr, 31 40*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 41*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 42*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 -1 43*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 44*9880d681SAndroid Build Coastguard Worker ret i32 %0 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo2a 47*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* {{[^,]+}}, align 32 48*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine i32 @goo(i32* nocapture %a) nounwind uwtable readonly { 52*9880d681SAndroid Build Coastguard Workerentry: 53*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 54*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 55*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 56*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 57*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %a, align 4 58*9880d681SAndroid Build Coastguard Worker ret i32 %0 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @goo 61*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* {{[^,]+}}, align 32 62*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine i32 @hoo(i32* nocapture %a) nounwind uwtable readonly { 66*9880d681SAndroid Build Coastguard Workerentry: 67*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 68*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 69*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 70*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 71*9880d681SAndroid Build Coastguard Worker br label %for.body 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 74*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 75*9880d681SAndroid Build Coastguard Worker %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] 76*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 77*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 78*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %r.06 79*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add i64 %indvars.iv, 8 80*9880d681SAndroid Build Coastguard Worker %1 = trunc i64 %indvars.iv.next to i32 81*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %1, 2048 82*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 85*9880d681SAndroid Build Coastguard Worker %add.lcssa = phi i32 [ %add, %for.body ] 86*9880d681SAndroid Build Coastguard Worker ret i32 %add.lcssa 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hoo 89*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %arrayidx, align 32 90*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %add.lcssa 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i32 @joo(i32* nocapture %a) nounwind uwtable readonly { 94*9880d681SAndroid Build Coastguard Workerentry: 95*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 96*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 97*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 98*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 99*9880d681SAndroid Build Coastguard Worker br label %for.body 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 102*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 4, %entry ], [ %indvars.iv.next, %for.body ] 103*9880d681SAndroid Build Coastguard Worker %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] 104*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 105*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 106*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %r.06 107*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add i64 %indvars.iv, 8 108*9880d681SAndroid Build Coastguard Worker %1 = trunc i64 %indvars.iv.next to i32 109*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %1, 2048 110*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 113*9880d681SAndroid Build Coastguard Worker %add.lcssa = phi i32 [ %add, %for.body ] 114*9880d681SAndroid Build Coastguard Worker ret i32 %add.lcssa 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @joo 117*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %arrayidx, align 16 118*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %add.lcssa 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine i32 @koo(i32* nocapture %a) nounwind uwtable readonly { 122*9880d681SAndroid Build Coastguard Workerentry: 123*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 124*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 125*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 126*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 127*9880d681SAndroid Build Coastguard Worker br label %for.body 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 130*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 131*9880d681SAndroid Build Coastguard Worker %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] 132*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 133*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 134*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %r.06 135*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add i64 %indvars.iv, 4 136*9880d681SAndroid Build Coastguard Worker %1 = trunc i64 %indvars.iv.next to i32 137*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %1, 2048 138*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 141*9880d681SAndroid Build Coastguard Worker %add.lcssa = phi i32 [ %add, %for.body ] 142*9880d681SAndroid Build Coastguard Worker ret i32 %add.lcssa 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @koo 145*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %arrayidx, align 16 146*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %add.lcssa 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine i32 @koo2(i32* nocapture %a) nounwind uwtable readonly { 150*9880d681SAndroid Build Coastguard Workerentry: 151*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 152*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 153*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 154*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 155*9880d681SAndroid Build Coastguard Worker br label %for.body 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 158*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ -4, %entry ], [ %indvars.iv.next, %for.body ] 159*9880d681SAndroid Build Coastguard Worker %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ] 160*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 161*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 162*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %r.06 163*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add i64 %indvars.iv, 4 164*9880d681SAndroid Build Coastguard Worker %1 = trunc i64 %indvars.iv.next to i32 165*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %1, 2048 166*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 169*9880d681SAndroid Build Coastguard Worker %add.lcssa = phi i32 [ %add, %for.body ] 170*9880d681SAndroid Build Coastguard Worker ret i32 %add.lcssa 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @koo2 173*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32* %arrayidx, align 16 174*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %add.lcssa 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerdefine i32 @moo(i32* nocapture %a) nounwind uwtable { 178*9880d681SAndroid Build Coastguard Workerentry: 179*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 180*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 181*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 182*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 183*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32* %a to i8* 184*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 64, i32 4, i1 false) 185*9880d681SAndroid Build Coastguard Worker ret i32 undef 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @moo 188*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 64, i32 32, i1 false) 189*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerdefine i32 @moo2(i32* nocapture %a, i32* nocapture %b) nounwind uwtable { 193*9880d681SAndroid Build Coastguard Workerentry: 194*9880d681SAndroid Build Coastguard Worker %ptrint = ptrtoint i32* %a to i64 195*9880d681SAndroid Build Coastguard Worker %maskedptr = and i64 %ptrint, 31 196*9880d681SAndroid Build Coastguard Worker %maskcond = icmp eq i64 %maskedptr, 0 197*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond) 198*9880d681SAndroid Build Coastguard Worker %ptrint1 = ptrtoint i32* %b to i64 199*9880d681SAndroid Build Coastguard Worker %maskedptr3 = and i64 %ptrint1, 127 200*9880d681SAndroid Build Coastguard Worker %maskcond4 = icmp eq i64 %maskedptr3, 0 201*9880d681SAndroid Build Coastguard Worker tail call void @llvm.assume(i1 %maskcond4) 202*9880d681SAndroid Build Coastguard Worker %0 = bitcast i32* %a to i8* 203*9880d681SAndroid Build Coastguard Worker %1 = bitcast i32* %b to i8* 204*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 64, i32 4, i1 false) 205*9880d681SAndroid Build Coastguard Worker ret i32 undef 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @moo2 208*9880d681SAndroid Build Coastguard Worker; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 64, i32 32, i1 false) 209*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef 210*9880d681SAndroid Build Coastguard Worker} 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.assume(i1) nounwind 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind 215*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind 216*9880d681SAndroid Build Coastguard Worker 217