Fix createOpUndef tests.
authorAndrew Woloszyn <awoloszyn@google.com>
Wed, 16 Mar 2016 20:06:16 +0000 (16:06 -0400)
committerAndrew Woloszyn <awoloszyn@google.com>
Thu, 17 Mar 2016 13:39:41 +0000 (09:39 -0400)
If we get a Nan from the OpFMul %f32 %undef %c_f32_0 then zero that
out as well.

external/vulkancts/modules/vulkan/spirv_assembly/vktSpvAsmInstructionTests.cpp

index 0e731a2..6534693 100644 (file)
@@ -6726,8 +6726,10 @@ tcu::TestCaseGroup* createOpUndefTests(tcu::TestContext& testCtx)
                "%label_testfun = OpLabel\n"
                "%undef = OpUndef %f32\n"
                "%zero = OpFMul %f32 %undef %c_f32_0\n"
+               "%is_nan = OpIsNan %bool %zero\n" //OpUndef may result in NaN which may turn %zero into Nan.
+               "%actually_zero = OpSelect %f32 %is_nan %c_f32_0 %zero\n"
                "%a = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
-               "%b = OpFAdd %f32 %a %zero\n"
+               "%b = OpFAdd %f32 %a %actually_zero\n"
                "%ret = OpVectorInsertDynamic %v4f32 %param1 %b %c_i32_0\n"
                "OpReturnValue %ret\n"
                "OpFunctionEnd\n"
@@ -6770,14 +6772,22 @@ tcu::TestCaseGroup* createOpUndefTests(tcu::TestContext& testCtx)
                "%zero_1 = OpVectorExtractDynamic %f32 %vzero %c_i32_1\n"
                "%zero_2 = OpVectorExtractDynamic %f32 %vzero %c_i32_2\n"
                "%zero_3 = OpVectorExtractDynamic %f32 %vzero %c_i32_3\n"
+               "%is_nan_0 = OpIsNan %bool %zero_0\n"
+               "%is_nan_1 = OpIsNan %bool %zero_1\n"
+               "%is_nan_2 = OpIsNan %bool %zero_2\n"
+               "%is_nan_3 = OpIsNan %bool %zero_3\n"
+               "%actually_zero_0 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_0\n"
+               "%actually_zero_1 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_1\n"
+               "%actually_zero_2 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_2\n"
+               "%actually_zero_3 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_3\n"
                "%param1_0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
                "%param1_1 = OpVectorExtractDynamic %f32 %param1 %c_i32_1\n"
                "%param1_2 = OpVectorExtractDynamic %f32 %param1 %c_i32_2\n"
                "%param1_3 = OpVectorExtractDynamic %f32 %param1 %c_i32_3\n"
-               "%sum_0 = OpFAdd %f32 %param1_0 %zero_0\n"
-               "%sum_1 = OpFAdd %f32 %param1_1 %zero_1\n"
-               "%sum_2 = OpFAdd %f32 %param1_2 %zero_2\n"
-               "%sum_3 = OpFAdd %f32 %param1_3 %zero_3\n"
+               "%sum_0 = OpFAdd %f32 %param1_0 %actually_zero_0\n"
+               "%sum_1 = OpFAdd %f32 %param1_1 %actually_zero_1\n"
+               "%sum_2 = OpFAdd %f32 %param1_2 %actually_zero_2\n"
+               "%sum_3 = OpFAdd %f32 %param1_3 %actually_zero_3\n"
                "%ret3 = OpVectorInsertDynamic %v4f32 %param1 %sum_3 %c_i32_3\n"
                "%ret2 = OpVectorInsertDynamic %v4f32 %ret3 %sum_2 %c_i32_2\n"
                "%ret1 = OpVectorInsertDynamic %v4f32 %ret2 %sum_1 %c_i32_1\n"
@@ -6800,14 +6810,22 @@ tcu::TestCaseGroup* createOpUndefTests(tcu::TestContext& testCtx)
                "%zero_1 = OpCompositeExtract %f32 %mzero 0 1\n"
                "%zero_2 = OpCompositeExtract %f32 %mzero 1 0\n"
                "%zero_3 = OpCompositeExtract %f32 %mzero 1 1\n"
+               "%is_nan_0 = OpIsNan %bool %zero_0\n"
+               "%is_nan_1 = OpIsNan %bool %zero_1\n"
+               "%is_nan_2 = OpIsNan %bool %zero_2\n"
+               "%is_nan_3 = OpIsNan %bool %zero_3\n"
+               "%actually_zero_0 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_0\n"
+               "%actually_zero_1 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_1\n"
+               "%actually_zero_2 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_2\n"
+               "%actually_zero_3 = OpSelect %f32 %is_nan_0 %c_f32_0 %zero_3\n"
                "%param1_0 = OpVectorExtractDynamic %f32 %param1 %c_i32_0\n"
                "%param1_1 = OpVectorExtractDynamic %f32 %param1 %c_i32_1\n"
                "%param1_2 = OpVectorExtractDynamic %f32 %param1 %c_i32_2\n"
                "%param1_3 = OpVectorExtractDynamic %f32 %param1 %c_i32_3\n"
-               "%sum_0 = OpFAdd %f32 %param1_0 %zero_0\n"
-               "%sum_1 = OpFAdd %f32 %param1_1 %zero_1\n"
-               "%sum_2 = OpFAdd %f32 %param1_2 %zero_2\n"
-               "%sum_3 = OpFAdd %f32 %param1_3 %zero_3\n"
+               "%sum_0 = OpFAdd %f32 %param1_0 %actually_zero_0\n"
+               "%sum_1 = OpFAdd %f32 %param1_1 %actually_zero_1\n"
+               "%sum_2 = OpFAdd %f32 %param1_2 %actually_zero_2\n"
+               "%sum_3 = OpFAdd %f32 %param1_3 %actually_zero_3\n"
                "%ret3 = OpVectorInsertDynamic %v4f32 %param1 %sum_3 %c_i32_3\n"
                "%ret2 = OpVectorInsertDynamic %v4f32 %ret3 %sum_2 %c_i32_2\n"
                "%ret1 = OpVectorInsertDynamic %v4f32 %ret2 %sum_1 %c_i32_1\n"