; RUN: llc < %s -mtriple=arm-apple-darwin | FileCheck %s define i32 @f(i32 %a, i32 %b) nounwind ssp { entry: ; CHECK: f: ; CHECK: subs ; CHECK-NOT: cmp %cmp = icmp sgt i32 %a, %b %sub = sub nsw i32 %a, %b %sub. = select i1 %cmp, i32 %sub, i32 0 ret i32 %sub. } define i32 @g(i32 %a, i32 %b) nounwind ssp { entry: ; CHECK: g: ; CHECK: subs ; CHECK-NOT: cmp %cmp = icmp slt i32 %a, %b %sub = sub nsw i32 %b, %a %sub. = select i1 %cmp, i32 %sub, i32 0 ret i32 %sub. } define i32 @h(i32 %a, i32 %b) nounwind ssp { entry: ; CHECK: h: ; CHECK: subs ; CHECK-NOT: cmp %cmp = icmp sgt i32 %a, 3 %sub = sub nsw i32 %a, 3 %sub. = select i1 %cmp, i32 %sub, i32 %b ret i32 %sub. } ; rdar://11725965 define i32 @i(i32 %a, i32 %b) nounwind readnone ssp { entry: ; CHECK: i: ; CHECK: subs ; CHECK-NOT: cmp %cmp = icmp ult i32 %a, %b %sub = sub i32 %b, %a %sub. = select i1 %cmp, i32 %sub, i32 0 ret i32 %sub. } ; If CPSR is live-out, we can't remove cmp if there exists ; a swapped sub. define i32 @j(i32 %a, i32 %b) nounwind { entry: ; CHECK: j: ; CHECK: sub ; CHECK: cmp %cmp = icmp eq i32 %b, %a %sub = sub nsw i32 %a, %b br i1 %cmp, label %if.then, label %if.else if.then: %cmp2 = icmp sgt i32 %b, %a %sel = select i1 %cmp2, i32 %sub, i32 %a ret i32 %sel if.else: ret i32 %sub }