| ; 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 |
| } |