blob: 440bb89f03270e18a327d4489ed9137d238061d7 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -passes='default<O2>' -S < %s | FileCheck %s
; Verify that a single-iteration loop at -Oz (minsize) is eliminated early
; enough in the pipeline for mid-pipeline passes such as DSE to optimize across
; it, even when the loop body contains calls that prevent full unrolling at
; minsize.
declare void @g(ptr)
define void @single_iter_loop_minsize(ptr noalias %p, ptr noalias %q) minsize optsize {
; CHECK-LABEL: define void @single_iter_loop_minsize(
; CHECK-SAME: ptr noalias [[P:%.*]], ptr noalias nofree writeonly captures(none) initializes((0, 4)) [[Q:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: tail call void @g(ptr [[P]])
; CHECK-NEXT: tail call void @g(ptr [[P]])
; CHECK-NEXT: tail call void @g(ptr [[P]])
; CHECK-NEXT: store i32 0, ptr [[Q]], align 4
; CHECK-NEXT: store i32 42, ptr [[P]], align 4
; CHECK-NEXT: ret void
;
entry:
%i = alloca i32, align 4
store i32 0, ptr %i, align 4
br label %for.cond
for.cond:
%0 = load i32, ptr %i, align 4
%cmp = icmp slt i32 %0, 1
br i1 %cmp, label %for.body, label %for.end
for.body:
call void @g(ptr %p)
call void @g(ptr %p)
call void @g(ptr %p)
store i32 10, ptr %p, align 4
br label %for.inc
for.inc:
%1 = load i32, ptr %i, align 4
%inc = add nsw i32 %1, 1
store i32 %inc, ptr %i, align 4
br label %for.cond
for.end:
store i32 0, ptr %q, align 4
store i32 42, ptr %p, align 4
ret void
}