Commit 258236ec1b

mlugg <mlugg@mlugg.co.uk>
2024-09-15 14:25:18
Sema: don't emit instruction when casting @min/@max result to OPV type
Resolves: #21408
1 parent 19924ca
Changed files (2)
src
test
src/Sema.zig
@@ -26201,6 +26201,10 @@ fn analyzeMinMax(
         .child = refined_scalar_ty.toIntern(),
     }) else refined_scalar_ty;
 
+    if (try sema.typeHasOnePossibleValue(refined_ty)) |opv| {
+        return Air.internedToRef(opv.toIntern());
+    }
+
     if (!refined_ty.eql(unrefined_ty, zcu)) {
         // We've reduced the type - cast the result down
         return block.addTyOp(.intcast, refined_ty, cur_minmax.?);
test/behavior/maximum_minimum.zig
@@ -336,3 +336,17 @@ test "@min/@max of signed and unsigned runtime integers" {
     try expectEqual(x, @min(x, y));
     try expectEqual(y, @max(x, y));
 }
+
+test "@min resulting in u0" {
+    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+
+    const S = struct {
+        fn min(a: u0, b: u8) u8 {
+            return @min(a, b);
+        }
+    };
+    const x = S.min(0, 1);
+    try expect(x == 0);
+}