"%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"
"%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"
"%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"