// #target: windows-x64 fn int foo() { return 1; } fn void test() { int x = foo(); int y = foo(); int z = foo(); assert(x > 0); assert(y > 0 && z > 0); assert(x > 0 && y > 0 && z > 0); assert(foo() > 0); assert(x > 0 && foo() > 0); assert(!(x < 1 || y < 1), "Foo"); } /* #expect: assert_variants.ll %x = alloca i32, align 4 %y = alloca i32, align 4 %z = alloca i32, align 4 %0 = call i32 @assert_variants.foo() store i32 %0, ptr %x, align 4 %1 = call i32 @assert_variants.foo() store i32 %1, ptr %y, align 4 %2 = call i32 @assert_variants.foo() store i32 %2, ptr %z, align 4 %3 = load i32, ptr %x, align 4 %gt = icmp sgt i32 %3, 0 call void @llvm.assume(i1 %gt) %4 = load i32, ptr %y, align 4 %gt1 = icmp sgt i32 %4, 0 call void @llvm.assume(i1 %gt1) %5 = load i32, ptr %z, align 4 %gt2 = icmp sgt i32 %5, 0 call void @llvm.assume(i1 %gt2) %6 = load i32, ptr %x, align 4 %gt3 = icmp sgt i32 %6, 0 call void @llvm.assume(i1 %gt3) %7 = load i32, ptr %y, align 4 %gt4 = icmp sgt i32 %7, 0 call void @llvm.assume(i1 %gt4) %8 = load i32, ptr %z, align 4 %gt5 = icmp sgt i32 %8, 0 call void @llvm.assume(i1 %gt5) %9 = load i32, ptr %x, align 4 %gt6 = icmp sgt i32 %9, 0 call void @llvm.assume(i1 %gt6) %10 = load i32, ptr %x, align 4 %lt = icmp slt i32 %10, 1 %not = xor i1 %lt, true call void @llvm.assume(i1 %not) %11 = load i32, ptr %y, align 4 %lt7 = icmp slt i32 %11, 1 %not8 = xor i1 %lt7, true call void @llvm.assume(i1 %not8) ret void