1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -verify-machineinstrs -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; LSR used to pick a sub-optimal solution due to the target responding 3*9880d681SAndroid Build Coastguard Worker; conservatively to isLegalAddImmediate for negative values. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i32) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine void @test(i32 %px) { 8*9880d681SAndroid Build Coastguard Worker; CHECK_LABEL: test: 9*9880d681SAndroid Build Coastguard Worker; CHECK_LABEL: %entry 10*9880d681SAndroid Build Coastguard Worker; CHECK: subs 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: csel 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker %sub = add nsw i32 %px, -1 14*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %px, 1 15*9880d681SAndroid Build Coastguard Worker %.sub = select i1 %cmp, i32 0, i32 %sub 16*9880d681SAndroid Build Coastguard Worker br label %for.body 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerfor.body: 19*9880d681SAndroid Build Coastguard Worker; CHECK_LABEL: %for.body 20*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: b.eq 22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %if.then3 23*9880d681SAndroid Build Coastguard Worker %x.015 = phi i32 [ %inc, %for.inc ], [ %.sub, %entry ] 24*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp eq i32 %x.015, %px 25*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %for.inc, label %if.then3 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerif.then3: 28*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %x.015) 29*9880d681SAndroid Build Coastguard Worker br label %for.inc 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerfor.inc: 32*9880d681SAndroid Build Coastguard Worker; CHECK_LABEL: %for.inc 33*9880d681SAndroid Build Coastguard Worker; CHECK: add 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmp 35*9880d681SAndroid Build Coastguard Worker; CHECK: b.le 36*9880d681SAndroid Build Coastguard Worker; CHECK_LABEL: %for.cond.cleanup 37*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %x.015, 1 38*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp sgt i32 %x.015, %px 39*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %for.cond.cleanup.loopexit, label %for.body 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup.loopexit: 42*9880d681SAndroid Build Coastguard Worker br label %for.cond.cleanup 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup: 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker} 47