While sinking instructions (that are loop invariant) from preheader to the exit block, we are skipping instructions due to decrementing instruction iterator twice.
37 lines
1.2 KiB
LLVM
37 lines
1.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: opt -S -passes=indvars < %s | FileCheck %s
|
|
|
|
define i32 @test() {
|
|
; CHECK-LABEL: define i32 @test() {
|
|
; CHECK-NEXT: [[ENTRY:.*:]]
|
|
; CHECK-NEXT: br label %[[LOOP_BODY:.*]]
|
|
; CHECK: [[LOOP_BODY]]:
|
|
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[LOOP_BODY]]
|
|
; CHECK: [[EXIT]]:
|
|
; CHECK-NEXT: [[XOR:%.*]] = xor i32 0, 3
|
|
; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[XOR]], 329
|
|
; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[MUL]] to i16
|
|
; CHECK-NEXT: [[SEXT:%.*]] = shl i16 [[CONV]], 8
|
|
; CHECK-NEXT: [[CONV1:%.*]] = ashr i16 [[SEXT]], 8
|
|
; CHECK-NEXT: [[CONV3:%.*]] = zext i16 [[CONV1]] to i32
|
|
; CHECK-NEXT: ret i32 [[CONV3]]
|
|
;
|
|
entry:
|
|
%xor = xor i32 0, 3
|
|
%mul = mul i32 %xor, 329
|
|
%conv = trunc i32 %mul to i16
|
|
%sext = shl i16 %conv, 8
|
|
%conv1 = ashr i16 %sext, 8
|
|
%conv3 = zext i16 %conv1 to i32
|
|
br label %loop.body
|
|
|
|
loop.body:
|
|
%indvar = phi i32 [ %indvar.inc, %loop.body ], [ 1, %entry ]
|
|
%indvar.inc = add nuw i32 %indvar, 1
|
|
%exitcond = icmp eq i32 %indvar, %conv3
|
|
br i1 %exitcond, label %exit, label %loop.body
|
|
|
|
exit:
|
|
ret i32 %conv3
|
|
}
|