| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | |
| ; RUN: opt -S -passes=indvars -replexitval=always < %s | FileCheck %s | |
| ; Reduced from https://github.com/llvm/llvm-project/issues/202028. | |
| declare i32 @llvm.cttz.i32(i32, i1) | |
| define i32 @speculated_exit_value_udiv(i32 %x, i1 %guard, i1 %backedge) { | |
| ; CHECK-LABEL: @speculated_exit_value_udiv( | |
| ; CHECK-NEXT: entry: | |
| ; CHECK-NEXT: [[CT:%.*]] = call i32 @llvm.cttz.i32(i32 [[X:%.*]], i1 true) | |
| ; CHECK-NEXT: [[D:%.*]] = add i32 [[CT]], 1 | |
| ; CHECK-NEXT: br label [[LOOP:%.*]] | |
| ; CHECK: loop: | |
| ; CHECK-NEXT: br i1 [[GUARD:%.*]], label [[EXIT_EARLY:%.*]], label [[BODY:%.*]] | |
| ; CHECK: body: | |
| ; CHECK-NEXT: [[REM:%.*]] = urem i32 1, [[D]] | |
| ; CHECK-NEXT: br i1 [[BACKEDGE:%.*]], label [[LOOP]], label [[EXIT_LATE:%.*]] | |
| ; CHECK: exit.early: | |
| ; CHECK-NEXT: ret i32 0 | |
| ; CHECK: exit.late: | |
| ; CHECK-NEXT: [[REM_LCSSA:%.*]] = phi i32 [ [[REM]], [[BODY]] ] | |
| ; CHECK-NEXT: ret i32 [[REM_LCSSA]] | |
| ; | |
| entry: | |
| %ct = call i32 @llvm.cttz.i32(i32 %x, i1 true) | |
| %d = add i32 %ct, 1 | |
| br label %loop | |
| loop: | |
| br i1 %guard, label %exit.early, label %body | |
| body: | |
| %rem = urem i32 1, %d | |
| br i1 %backedge, label %loop, label %exit.late | |
| exit.early: | |
| ret i32 0 | |
| exit.late: | |
| ret i32 %rem | |
| } |