| //@ ignore-std-debug-assertions |
| //@ compile-flags: -Copt-level=3 -C no-prepopulate-passes |
| |
| #![crate_type = "lib"] |
| |
| // Ensure that MIR optimizations have cleaned things up enough that the IR we |
| // emit is good even without running the LLVM optimizations. |
| |
| // CHECK-NOT: define |
| |
| // CHECK-LABEL: define{{.+}}void @call_for_zero_to_n |
| #[no_mangle] |
| pub fn call_for_zero_to_n(n: u32, f: fn(u32)) { |
| // CHECK: start: |
| // CHECK-NOT: alloca |
| // CHECK: %[[IND:.+]] = alloca [4 x i8] |
| // CHECK-NEXT: %[[ALWAYS_SOME_OPTION:.+]] = alloca |
| // CHECK-NOT: alloca |
| // CHECK: store i32 0, ptr %[[IND]], |
| // CHECK: br label %[[HEAD:.+]] |
| |
| // CHECK: [[HEAD]]: |
| // CHECK: %[[T1:.+]] = load i32, ptr %[[IND]], |
| // CHECK: %[[NOT_DONE:.+]] = icmp ult i32 %[[T1]], %n |
| // CHECK: br i1 %[[NOT_DONE]], label %[[BODY:.+]], label %[[BREAK:.+]] |
| |
| // CHECK: [[BREAK]]: |
| // CHECK: ret void |
| |
| // CHECK: [[BODY]]: |
| // CHECK: %[[T2:.+]] = load i32, ptr %[[IND]], |
| // CHECK: %[[T3:.+]] = add nuw i32 %[[T2]], 1 |
| // CHECK: store i32 %[[T3]], ptr %[[IND]], |
| |
| // CHECK: store i32 %[[T2]] |
| // CHECK: %[[T4:.+]] = load i32 |
| // CHECK: call void %f(i32{{.+}}%[[T4]]) |
| |
| for i in 0..n { |
| f(i); |
| } |
| } |
| |
| // CHECK-NOT: define |