; RUN: llc < %s -mcpu=cyclone -verify-machineinstrs -aarch64-enable-ccmp | FileCheck %s
target triple = "arm64-apple-ios7.0.0"
@channelColumns = external global i64
@channelTracks = external global i64
@mazeRoute = external hidden unnamed_addr global ptr, align 8
@TOP = external global ptr
@BOT = external global ptr
@netsAssign = external global ptr
; Function from yacr2/maze.c
; The branch at the end of %if.then is driven by %cmp5 and %cmp6.
; Isel converts the and i1 into two branches, and arm64-ccmp should not convert
; it back again. %cmp6 has much higher latency than %cmp5.
; CHECK: Maze1
; CHECK: %if.then
; CHECK: cmp x{{[0-9]+}}, #2
; CHECK-NEXT: b.lo
; CHECK: %if.then
; CHECK: cmp x{{[0-9]+}}, #2
; CHECK-NEXT: b.lo
define i32 @Maze1() nounwind ssp {
entry:
%0 = load i64, ptr @channelColumns, align 8, !tbaa !0
%cmp90 = icmp eq i64 %0, 0
br i1 %cmp90, label %for.end, label %for.body
for.body: ; preds = %for.inc, %entry
%1 = phi i64 [ %0, %entry ], [ %37, %for.inc ]
%i.092 = phi i64 [ 1, %entry ], [ %inc53, %for.inc ]
%numLeft.091 = phi i32 [ 0, %entry ], [ %numLeft.1, %for.inc ]
%2 = load ptr, ptr @mazeRoute, align 8, !tbaa !3
%arrayidx = getelementptr inbounds i8, ptr %2, i64 %i.092
%3 = load i8, ptr %arrayidx, align 1, !tbaa !1
%tobool = icmp eq i8 %3, 0
br i1 %tobool, label %for.inc, label %if.then
if.then: ; preds = %for.body
%4 = load ptr, ptr @TOP, align 8, !tbaa !3
%arrayidx1 = getelementptr inbounds i64, ptr %4, i64 %i.092
%5 = load i64, ptr %arrayidx1, align 8, !tbaa !0
%6 = load ptr, ptr @netsAssign, align 8, !tbaa !3
%arrayidx2 = getelementptr inbounds i64, ptr %6, i64 %5
%7 = load i64, ptr %arrayidx2, align 8, !tbaa !0
%8 = load ptr, ptr @BOT, align 8, !tbaa !3
%arrayidx3 = getelementptr inbounds i64, ptr %8, i64 %i.092
%9 = load i64, ptr %arrayidx3, align 8, !tbaa !0
%arrayidx4 = getelementptr inbounds i64, ptr %6, i64 %9
%10 = load i64, ptr %arrayidx4, align 8, !tbaa !0
%cmp5 = icmp ugt i64 %i.092, 1
%cmp6 = icmp ugt i64 %10, 1
%or.cond = and i1 %cmp5, %cmp6
br i1 %or.cond, label %land.lhs.true7, label %if.else
land.lhs.true7: ; preds = %if.then
%11 = load i64, ptr @channelTracks, align 8, !tbaa !0
%add = add i64 %11, 1
%call = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 %add, i64 %10, i64 0, i64 %7, i32 -1, i32 -1)
%tobool8 = icmp eq i32 %call, 0
br i1 %tobool8, label %land.lhs.true7.if.else_crit_edge, label %if.then9
land.lhs.true7.if.else_crit_edge: ; preds = %land.lhs.true7
%.pre = load i64, ptr @channelColumns, align 8, !tbaa !0
br label %if.else
if.then9: ; preds = %land.lhs.true7
%12 = load ptr, ptr @mazeRoute, align 8, !tbaa !3
%arrayidx10 = getelementptr inbounds i8, ptr %12, i64 %i.092
store i8 0, ptr %arrayidx10, align 1, !tbaa !1
%13 = load ptr, ptr @TOP, align 8, !tbaa !3
%arrayidx11 = getelementptr inbounds i64, ptr %13, i64 %i.092
%14 = load i64, ptr %arrayidx11, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %14)
%15 = load ptr, ptr @BOT, align 8, !tbaa !3
%arrayidx12 = getelementptr inbounds i64, ptr %15, i64 %i.092
%16 = load i64, ptr %arrayidx12, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %16)
br label %for.inc
if.else: ; preds = %land.lhs.true7.if.else_crit_edge, %if.then
%17 = phi i64 [ %.pre, %land.lhs.true7.if.else_crit_edge ], [ %1, %if.then ]
%cmp13 = icmp ult i64 %i.092, %17
%or.cond89 = and i1 %cmp13, %cmp6
br i1 %or.cond89, label %land.lhs.true16, label %if.else24
land.lhs.true16: ; preds = %if.else
%18 = load i64, ptr @channelTracks, align 8, !tbaa !0
%add17 = add i64 %18, 1
%call18 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 %add17, i64 %10, i64 0, i64 %7, i32 1, i32 -1)
%tobool19 = icmp eq i32 %call18, 0
br i1 %tobool19, label %if.else24, label %if.then20
if.then20: ; preds = %land.lhs.true16
%19 = load ptr, ptr @mazeRoute, align 8, !tbaa !3
%arrayidx21 = getelementptr inbounds i8, ptr %19, i64 %i.092
store i8 0, ptr %arrayidx21, align 1, !tbaa !1
%20 = load ptr, ptr @TOP, align 8, !tbaa !3
%arrayidx22 = getelementptr inbounds i64, ptr %20, i64 %i.092
%21 = load i64, ptr %arrayidx22, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %21)
%22 = load ptr, ptr @BOT, align 8, !tbaa !3
%arrayidx23 = getelementptr inbounds i64, ptr %22, i64 %i.092
%23 = load i64, ptr %arrayidx23, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %23)
br label %for.inc
if.else24: ; preds = %land.lhs.true16, %if.else
br i1 %cmp5, label %land.lhs.true26, label %if.else36
land.lhs.true26: ; preds = %if.else24
%24 = load i64, ptr @channelTracks, align 8, !tbaa !0
%cmp27 = icmp ult i64 %7, %24
br i1 %cmp27, label %land.lhs.true28, label %if.else36
land.lhs.true28: ; preds = %land.lhs.true26
%add29 = add i64 %24, 1
%call30 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 0, i64 %7, i64 %add29, i64 %10, i32 -1, i32 1)
%tobool31 = icmp eq i32 %call30, 0
br i1 %tobool31, label %if.else36, label %if.then32
if.then32: ; preds = %land.lhs.true28
%25 = load ptr, ptr @mazeRoute, align 8, !tbaa !3
%arrayidx33 = getelementptr inbounds i8, ptr %25, i64 %i.092
store i8 0, ptr %arrayidx33, align 1, !tbaa !1
%26 = load ptr, ptr @TOP, align 8, !tbaa !3
%arrayidx34 = getelementptr inbounds i64, ptr %26, i64 %i.092
%27 = load i64, ptr %arrayidx34, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %27)
%28 = load ptr, ptr @BOT, align 8, !tbaa !3
%arrayidx35 = getelementptr inbounds i64, ptr %28, i64 %i.092
%29 = load i64, ptr %arrayidx35, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %29)
br label %for.inc
if.else36: ; preds = %land.lhs.true28, %land.lhs.true26, %if.else24
%30 = load i64, ptr @channelColumns, align 8, !tbaa !0
%cmp37 = icmp ult i64 %i.092, %30
br i1 %cmp37, label %land.lhs.true38, label %if.else48
land.lhs.true38: ; preds = %if.else36
%31 = load i64, ptr @channelTracks, align 8, !tbaa !0
%cmp39 = icmp ult i64 %7, %31
br i1 %cmp39, label %land.lhs.true40, label %if.else48
land.lhs.true40: ; preds = %land.lhs.true38
%add41 = add i64 %31, 1
%call42 = tail call fastcc i32 @Maze1Mech(i64 %i.092, i64 0, i64 %7, i64 %add41, i64 %10, i32 1, i32 1)
%tobool43 = icmp eq i32 %call42, 0
br i1 %tobool43, label %if.else48, label %if.then44
if.then44: ; preds = %land.lhs.true40
%32 = load ptr, ptr @mazeRoute, align 8, !tbaa !3
%arrayidx45 = getelementptr inbounds i8, ptr %32, i64 %i.092
store i8 0, ptr %arrayidx45, align 1, !tbaa !1
%33 = load ptr, ptr @TOP, align 8, !tbaa !3
%arrayidx46 = getelementptr inbounds i64, ptr %33, i64 %i.092
%34 = load i64, ptr %arrayidx46, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %34)
%35 = load ptr, ptr @BOT, align 8, !tbaa !3
%arrayidx47 = getelementptr inbounds i64, ptr %35, i64 %i.092
%36 = load i64, ptr %arrayidx47, align 8, !tbaa !0
tail call fastcc void @CleanNet(i64 %36)
br label %for.inc
if.else48: ; preds = %land.lhs.true40, %land.lhs.true38, %if.else36
%inc = add nsw i32 %numLeft.091, 1
br label %for.inc
for.inc: ; preds = %if.else48, %if.then44, %if.then32, %if.then20, %if.then9, %for.body
%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 ]
%inc53 = add i64 %i.092, 1
%37 = load i64, ptr @channelColumns, align 8, !tbaa !0
%cmp = icmp ugt i64 %inc53, %37
br i1 %cmp, label %for.end, label %for.body
for.end: ; preds = %for.inc, %entry
%numLeft.0.lcssa = phi i32 [ 0, %entry ], [ %numLeft.1, %for.inc ]
ret i32 %numLeft.0.lcssa
}
; Materializable
declare hidden fastcc i32 @Maze1Mech(i64, i64, i64, i64, i64, i32, i32) nounwind ssp
; Materializable
declare hidden fastcc void @CleanNet(i64) nounwind ssp
!0 = !{!"long", !1}
!1 = !{!"omnipotent char", !2}
!2 = !{!"Simple C/C++ TBAA"}
!3 = !{!"any pointer", !1}