// #target: macos-x64 enum Foo { ABC, DEF } fn int main() { int a; Foo? x = ABC; Foo f = x ?? DEF; return 0; } /* expect: test.ll define void @top_down_casts.test() #0 { entry: %x = alloca i32, align 4 %y = alloca i32, align 4 %z = alloca i64, align 8 %w = alloca i32, align 4 %w.f = alloca i64, align 8 store i32 0, ptr %x, align 4 store i32 0, ptr %y, align 4 %0 = load i32, ptr %x, align 4 %sext = sext i32 %0 to i64 %1 = load i32, ptr %y, align 4 %sext1 = sext i32 %1 to i64 %mul = mul i64 %sext, %sext1 store i64 %mul, ptr %z, align 8 %2 = load i32, ptr %x, align 4 %3 = load i32, ptr %y, align 4 %sdiv = sdiv i32 %2, %3 %sext2 = sext i32 %sdiv to i64 store i64 %sext2, ptr %z, align 8 %4 = load i32, ptr %x, align 4 %sext3 = sext i32 %4 to i64 %5 = load i32, ptr %y, align 4 %sext4 = sext i32 %5 to i64 %add = add i64 %sext3, %sext4 store i64 %add, ptr %z, align 8 %6 = load i32, ptr %x, align 4 %sext5 = sext i32 %6 to i64 %7 = load i32, ptr %y, align 4 %sext6 = sext i32 %7 to i64 %sub = sub i64 %sext5, %sext6 store i64 %sub, ptr %z, align 8 %8 = load i32, ptr %x, align 4 %9 = load i32, ptr %y, align 4 %smod = srem i32 %8, %9 %sext7 = sext i32 %smod to i64 store i64 %sext7, ptr %z, align 8 %10 = load i32, ptr %x, align 4 %sext8 = sext i32 %10 to i64 %11 = load i32, ptr %y, align 4 %zext = zext i32 %11 to i64 %shl = shl i64 %sext8, %zext %12 = freeze i64 %shl store i64 %12, ptr %z, align 8 %13 = load i32, ptr %x, align 4 %sext9 = sext i32 %13 to i64 %14 = load i32, ptr %y, align 4 %zext10 = zext i32 %14 to i64 %ashr = ashr i64 %sext9, %zext10 %15 = freeze i64 %ashr store i64 %15, ptr %z, align 8 %16 = load i32, ptr %x, align 4 %bnot = xor i32 %16, -1 %sext11 = sext i32 %bnot to i64 store i64 %sext11, ptr %z, align 8 %17 = load i32, ptr %x, align 4 %neg = sub i32 0, %17 %sext12 = sext i32 %neg to i64 store i64 %sext12, ptr %z, align 8 store i64 0, ptr %w.f, align 8 store i32 0, ptr %w, align 4 %optval = load i64, ptr %w.f, align 8 %not_err = icmp eq i64 %optval, 0 %18 = call i1 @llvm.expect.i1(i1 %not_err, i1 true) br i1 %18, label %after_check, label %else_block after_check: ; preds = %entry %19 = load i32, ptr %w, align 4 %sext13 = sext i32 %19 to i64 br label %phi_block else_block: ; preds = %entry br label %phi_block phi_block: ; preds = %else_block, %after_check %val = phi i64 [ %sext13, %after_check ], [ 1, %else_block ] store i64 %val, ptr %z, align 8 ret void }