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