blob: f6250bb7051b5880dc71488f4ef7c079071902e3 [file]
; 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
}