1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=cyclone -verify-machineinstrs -aarch64-ccmp | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget triple = "arm64-apple-ios7.0.0" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker@channelColumns = external global i64 5*9880d681SAndroid Build Coastguard Worker@channelTracks = external global i64 6*9880d681SAndroid Build Coastguard Worker@mazeRoute = external hidden unnamed_addr global i8*, align 8 7*9880d681SAndroid Build Coastguard Worker@TOP = external global i64* 8*9880d681SAndroid Build Coastguard Worker@BOT = external global i64* 9*9880d681SAndroid Build Coastguard Worker@netsAssign = external global i64* 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; Function from yacr2/maze.c 12*9880d681SAndroid Build Coastguard Worker; The branch at the end of %if.then is driven by %cmp5 and %cmp6. 13*9880d681SAndroid Build Coastguard Worker; Isel converts the and i1 into two branches, and arm64-ccmp should not convert 14*9880d681SAndroid Build Coastguard Worker; it back again. %cmp6 has much higher latency than %cmp5. 15*9880d681SAndroid Build Coastguard Worker; CHECK: Maze1 16*9880d681SAndroid Build Coastguard Worker; CHECK: %if.then 17*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x{{[0-9]+}}, #2 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.lo 19*9880d681SAndroid Build Coastguard Worker; CHECK: %if.then 20*9880d681SAndroid Build Coastguard Worker; CHECK: cmp x{{[0-9]+}}, #2 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.lo 22*9880d681SAndroid Build Coastguard Workerdefine i32 @Maze1() nounwind ssp { 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* @channelColumns, align 8, !tbaa !0 25*9880d681SAndroid Build Coastguard Worker %cmp90 = icmp eq i64 %0, 0 26*9880d681SAndroid Build Coastguard Worker br i1 %cmp90, label %for.end, label %for.body 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.inc, %entry 29*9880d681SAndroid Build Coastguard Worker %1 = phi i64 [ %0, %entry ], [ %37, %for.inc ] 30*9880d681SAndroid Build Coastguard Worker %i.092 = phi i64 [ 1, %entry ], [ %inc53, %for.inc ] 31*9880d681SAndroid Build Coastguard Worker %numLeft.091 = phi i32 [ 0, %entry ], [ %numLeft.1, %for.inc ] 32*9880d681SAndroid Build Coastguard Worker %2 = load i8*, i8** @mazeRoute, align 8, !tbaa !3 33*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i8, i8* %2, i64 %i.092 34*9880d681SAndroid Build Coastguard Worker %3 = load i8, i8* %arrayidx, align 1, !tbaa !1 35*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i8 %3, 0 36*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %for.inc, label %if.then 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %for.body 39*9880d681SAndroid Build Coastguard Worker %4 = load i64*, i64** @TOP, align 8, !tbaa !3 40*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds i64, i64* %4, i64 %i.092 41*9880d681SAndroid Build Coastguard Worker %5 = load i64, i64* %arrayidx1, align 8, !tbaa !0 42*9880d681SAndroid Build Coastguard Worker %6 = load i64*, i64** @netsAssign, align 8, !tbaa !3 43*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds i64, i64* %6, i64 %5 44*9880d681SAndroid Build Coastguard Worker %7 = load i64, i64* %arrayidx2, align 8, !tbaa !0 45*9880d681SAndroid Build Coastguard Worker %8 = load i64*, i64** @BOT, align 8, !tbaa !3 46*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds i64, i64* %8, i64 %i.092 47*9880d681SAndroid Build Coastguard Worker %9 = load i64, i64* %arrayidx3, align 8, !tbaa !0 48*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds i64, i64* %6, i64 %9 49*9880d681SAndroid Build Coastguard Worker %10 = load i64, i64* %arrayidx4, align 8, !tbaa !0 50*9880d681SAndroid Build Coastguard Worker %cmp5 = icmp ugt i64 %i.092, 1 51*9880d681SAndroid Build Coastguard Worker %cmp6 = icmp ugt i64 %10, 1 52*9880d681SAndroid Build Coastguard Worker %or.cond = and i1 %cmp5, %cmp6 53*9880d681SAndroid Build Coastguard Worker br i1 %or.cond, label %land.lhs.true7, label %if.else 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerland.lhs.true7: ; preds = %if.then 56*9880d681SAndroid Build Coastguard Worker %11 = load i64, i64* @channelTracks, align 8, !tbaa !0 57*9880d681SAndroid Build Coastguard Worker %add = add i64 %11, 1 58*9880d681SAndroid Build Coastguard Worker %call = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 %add, i64 %10, i64 0, i64 %7, i32 -1, i32 -1) 59*9880d681SAndroid Build Coastguard Worker %tobool8 = icmp eq i32 %call, 0 60*9880d681SAndroid Build Coastguard Worker br i1 %tobool8, label %land.lhs.true7.if.else_crit_edge, label %if.then9 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerland.lhs.true7.if.else_crit_edge: ; preds = %land.lhs.true7 63*9880d681SAndroid Build Coastguard Worker %.pre = load i64, i64* @channelColumns, align 8, !tbaa !0 64*9880d681SAndroid Build Coastguard Worker br label %if.else 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerif.then9: ; preds = %land.lhs.true7 67*9880d681SAndroid Build Coastguard Worker %12 = load i8*, i8** @mazeRoute, align 8, !tbaa !3 68*9880d681SAndroid Build Coastguard Worker %arrayidx10 = getelementptr inbounds i8, i8* %12, i64 %i.092 69*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx10, align 1, !tbaa !1 70*9880d681SAndroid Build Coastguard Worker %13 = load i64*, i64** @TOP, align 8, !tbaa !3 71*9880d681SAndroid Build Coastguard Worker %arrayidx11 = getelementptr inbounds i64, i64* %13, i64 %i.092 72*9880d681SAndroid Build Coastguard Worker %14 = load i64, i64* %arrayidx11, align 8, !tbaa !0 73*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %14) 74*9880d681SAndroid Build Coastguard Worker %15 = load i64*, i64** @BOT, align 8, !tbaa !3 75*9880d681SAndroid Build Coastguard Worker %arrayidx12 = getelementptr inbounds i64, i64* %15, i64 %i.092 76*9880d681SAndroid Build Coastguard Worker %16 = load i64, i64* %arrayidx12, align 8, !tbaa !0 77*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %16) 78*9880d681SAndroid Build Coastguard Worker br label %for.inc 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %land.lhs.true7.if.else_crit_edge, %if.then 81*9880d681SAndroid Build Coastguard Worker %17 = phi i64 [ %.pre, %land.lhs.true7.if.else_crit_edge ], [ %1, %if.then ] 82*9880d681SAndroid Build Coastguard Worker %cmp13 = icmp ult i64 %i.092, %17 83*9880d681SAndroid Build Coastguard Worker %or.cond89 = and i1 %cmp13, %cmp6 84*9880d681SAndroid Build Coastguard Worker br i1 %or.cond89, label %land.lhs.true16, label %if.else24 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerland.lhs.true16: ; preds = %if.else 87*9880d681SAndroid Build Coastguard Worker %18 = load i64, i64* @channelTracks, align 8, !tbaa !0 88*9880d681SAndroid Build Coastguard Worker %add17 = add i64 %18, 1 89*9880d681SAndroid Build Coastguard Worker %call18 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 %add17, i64 %10, i64 0, i64 %7, i32 1, i32 -1) 90*9880d681SAndroid Build Coastguard Worker %tobool19 = icmp eq i32 %call18, 0 91*9880d681SAndroid Build Coastguard Worker br i1 %tobool19, label %if.else24, label %if.then20 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerif.then20: ; preds = %land.lhs.true16 94*9880d681SAndroid Build Coastguard Worker %19 = load i8*, i8** @mazeRoute, align 8, !tbaa !3 95*9880d681SAndroid Build Coastguard Worker %arrayidx21 = getelementptr inbounds i8, i8* %19, i64 %i.092 96*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx21, align 1, !tbaa !1 97*9880d681SAndroid Build Coastguard Worker %20 = load i64*, i64** @TOP, align 8, !tbaa !3 98*9880d681SAndroid Build Coastguard Worker %arrayidx22 = getelementptr inbounds i64, i64* %20, i64 %i.092 99*9880d681SAndroid Build Coastguard Worker %21 = load i64, i64* %arrayidx22, align 8, !tbaa !0 100*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %21) 101*9880d681SAndroid Build Coastguard Worker %22 = load i64*, i64** @BOT, align 8, !tbaa !3 102*9880d681SAndroid Build Coastguard Worker %arrayidx23 = getelementptr inbounds i64, i64* %22, i64 %i.092 103*9880d681SAndroid Build Coastguard Worker %23 = load i64, i64* %arrayidx23, align 8, !tbaa !0 104*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %23) 105*9880d681SAndroid Build Coastguard Worker br label %for.inc 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerif.else24: ; preds = %land.lhs.true16, %if.else 108*9880d681SAndroid Build Coastguard Worker br i1 %cmp5, label %land.lhs.true26, label %if.else36 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerland.lhs.true26: ; preds = %if.else24 111*9880d681SAndroid Build Coastguard Worker %24 = load i64, i64* @channelTracks, align 8, !tbaa !0 112*9880d681SAndroid Build Coastguard Worker %cmp27 = icmp ult i64 %7, %24 113*9880d681SAndroid Build Coastguard Worker br i1 %cmp27, label %land.lhs.true28, label %if.else36 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerland.lhs.true28: ; preds = %land.lhs.true26 116*9880d681SAndroid Build Coastguard Worker %add29 = add i64 %24, 1 117*9880d681SAndroid Build Coastguard Worker %call30 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 0, i64 %7, i64 %add29, i64 %10, i32 -1, i32 1) 118*9880d681SAndroid Build Coastguard Worker %tobool31 = icmp eq i32 %call30, 0 119*9880d681SAndroid Build Coastguard Worker br i1 %tobool31, label %if.else36, label %if.then32 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerif.then32: ; preds = %land.lhs.true28 122*9880d681SAndroid Build Coastguard Worker %25 = load i8*, i8** @mazeRoute, align 8, !tbaa !3 123*9880d681SAndroid Build Coastguard Worker %arrayidx33 = getelementptr inbounds i8, i8* %25, i64 %i.092 124*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx33, align 1, !tbaa !1 125*9880d681SAndroid Build Coastguard Worker %26 = load i64*, i64** @TOP, align 8, !tbaa !3 126*9880d681SAndroid Build Coastguard Worker %arrayidx34 = getelementptr inbounds i64, i64* %26, i64 %i.092 127*9880d681SAndroid Build Coastguard Worker %27 = load i64, i64* %arrayidx34, align 8, !tbaa !0 128*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %27) 129*9880d681SAndroid Build Coastguard Worker %28 = load i64*, i64** @BOT, align 8, !tbaa !3 130*9880d681SAndroid Build Coastguard Worker %arrayidx35 = getelementptr inbounds i64, i64* %28, i64 %i.092 131*9880d681SAndroid Build Coastguard Worker %29 = load i64, i64* %arrayidx35, align 8, !tbaa !0 132*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %29) 133*9880d681SAndroid Build Coastguard Worker br label %for.inc 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerif.else36: ; preds = %land.lhs.true28, %land.lhs.true26, %if.else24 136*9880d681SAndroid Build Coastguard Worker %30 = load i64, i64* @channelColumns, align 8, !tbaa !0 137*9880d681SAndroid Build Coastguard Worker %cmp37 = icmp ult i64 %i.092, %30 138*9880d681SAndroid Build Coastguard Worker br i1 %cmp37, label %land.lhs.true38, label %if.else48 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerland.lhs.true38: ; preds = %if.else36 141*9880d681SAndroid Build Coastguard Worker %31 = load i64, i64* @channelTracks, align 8, !tbaa !0 142*9880d681SAndroid Build Coastguard Worker %cmp39 = icmp ult i64 %7, %31 143*9880d681SAndroid Build Coastguard Worker br i1 %cmp39, label %land.lhs.true40, label %if.else48 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerland.lhs.true40: ; preds = %land.lhs.true38 146*9880d681SAndroid Build Coastguard Worker %add41 = add i64 %31, 1 147*9880d681SAndroid Build Coastguard Worker %call42 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 0, i64 %7, i64 %add41, i64 %10, i32 1, i32 1) 148*9880d681SAndroid Build Coastguard Worker %tobool43 = icmp eq i32 %call42, 0 149*9880d681SAndroid Build Coastguard Worker br i1 %tobool43, label %if.else48, label %if.then44 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerif.then44: ; preds = %land.lhs.true40 152*9880d681SAndroid Build Coastguard Worker %32 = load i8*, i8** @mazeRoute, align 8, !tbaa !3 153*9880d681SAndroid Build Coastguard Worker %arrayidx45 = getelementptr inbounds i8, i8* %32, i64 %i.092 154*9880d681SAndroid Build Coastguard Worker store i8 0, i8* %arrayidx45, align 1, !tbaa !1 155*9880d681SAndroid Build Coastguard Worker %33 = load i64*, i64** @TOP, align 8, !tbaa !3 156*9880d681SAndroid Build Coastguard Worker %arrayidx46 = getelementptr inbounds i64, i64* %33, i64 %i.092 157*9880d681SAndroid Build Coastguard Worker %34 = load i64, i64* %arrayidx46, align 8, !tbaa !0 158*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %34) 159*9880d681SAndroid Build Coastguard Worker %35 = load i64*, i64** @BOT, align 8, !tbaa !3 160*9880d681SAndroid Build Coastguard Worker %arrayidx47 = getelementptr inbounds i64, i64* %35, i64 %i.092 161*9880d681SAndroid Build Coastguard Worker %36 = load i64, i64* %arrayidx47, align 8, !tbaa !0 162*9880d681SAndroid Build Coastguard Worker tail call fastcc void @CleanNet(i64 %36) 163*9880d681SAndroid Build Coastguard Worker br label %for.inc 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerif.else48: ; preds = %land.lhs.true40, %land.lhs.true38, %if.else36 166*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %numLeft.091, 1 167*9880d681SAndroid Build Coastguard Worker br label %for.inc 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %if.else48, %if.then44, %if.then32, %if.then20, %if.then9, %for.body 170*9880d681SAndroid Build Coastguard Worker %numLeft.1 = phi i32 [ %numLeft.091, %if.then9 ], [ %numLeft.091, %if.then20 ], [ %numLeft.091, %if.then32 ], [ %numLeft.091, %if.then44 ], [ %inc, %if.else48 ], [ %numLeft.091, %for.body ] 171*9880d681SAndroid Build Coastguard Worker %inc53 = add i64 %i.092, 1 172*9880d681SAndroid Build Coastguard Worker %37 = load i64, i64* @channelColumns, align 8, !tbaa !0 173*9880d681SAndroid Build Coastguard Worker %cmp = icmp ugt i64 %inc53, %37 174*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.end, label %for.body 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.inc, %entry 177*9880d681SAndroid Build Coastguard Worker %numLeft.0.lcssa = phi i32 [ 0, %entry ], [ %numLeft.1, %for.inc ] 178*9880d681SAndroid Build Coastguard Worker ret i32 %numLeft.0.lcssa 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; Materializable 182*9880d681SAndroid Build Coastguard Workerdeclare hidden fastcc i32 @Maze1Mech(i64, i64, i64, i64, i64, i32, i32) nounwind ssp 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker; Materializable 185*9880d681SAndroid Build Coastguard Workerdeclare hidden fastcc void @CleanNet(i64) nounwind ssp 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker!0 = !{!"long", !1} 188*9880d681SAndroid Build Coastguard Worker!1 = !{!"omnipotent char", !2} 189*9880d681SAndroid Build Coastguard Worker!2 = !{!"Simple C/C++ TBAA"} 190*9880d681SAndroid Build Coastguard Worker!3 = !{!"any pointer", !1} 191