//@ 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