Browse Source

Fix conversions of literal negative ints to FP16 types. (#2382)

Tristan Labelle 6 years ago
parent
commit
9fab8c5c7c

+ 3 - 3
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -6437,7 +6437,7 @@ Value *CGMSHLSLRuntime::EmitHLSLLiteralCast(CodeGenFunction &CGF, Value *Src,
                                             QualType DstType) {
                                             QualType DstType) {
   auto &Builder = CGF.Builder;
   auto &Builder = CGF.Builder;
   llvm::Type *DstTy = CGF.ConvertType(DstType);
   llvm::Type *DstTy = CGF.ConvertType(DstType);
-  bool bDstSigned = DstType->isSignedIntegerType();
+  bool bSrcSigned = SrcType->isSignedIntegerType();
 
 
   if (ConstantInt *CI = dyn_cast<ConstantInt>(Src)) {
   if (ConstantInt *CI = dyn_cast<ConstantInt>(Src)) {
     APInt v = CI->getValue();
     APInt v = CI->getValue();
@@ -6465,7 +6465,7 @@ Value *CGMSHLSLRuntime::EmitHLSLLiteralCast(CodeGenFunction &CGF, Value *Src,
       else if (DstTy->isFloatTy())
       else if (DstTy->isFloatTy())
         return ConstantFP::get(DstTy, (float)val);
         return ConstantFP::get(DstTy, (float)val);
       else {
       else {
-        if (bDstSigned)
+        if (bSrcSigned)
           return Builder.CreateSIToFP(Src, DstTy);
           return Builder.CreateSIToFP(Src, DstTy);
         else
         else
           return Builder.CreateUIToFP(Src, DstTy);
           return Builder.CreateUIToFP(Src, DstTy);
@@ -6560,7 +6560,7 @@ Value *CGMSHLSLRuntime::EmitHLSLLiteralCast(CodeGenFunction &CGF, Value *Src,
               return Builder.CreateZExtOrTrunc(CastResult, DstTy);
               return Builder.CreateZExtOrTrunc(CastResult, DstTy);
           }
           }
         } else {
         } else {
-          if (bDstSigned)
+          if (bSrcSigned)
             return Builder.CreateSIToFP(CastResult, DstTy);
             return Builder.CreateSIToFP(CastResult, DstTy);
           else
           else
             return Builder.CreateUIToFP(CastResult, DstTy);
             return Builder.CreateUIToFP(CastResult, DstTy);

+ 13 - 0
tools/clang/test/CodeGenHLSL/batch/expressions/conversions_and_casts/negative_literal_int_to_float.hlsl

@@ -0,0 +1,13 @@
+// RUN: %dxc -E main -T vs_6_2 -enable-16bit-types -HV 2018 %s | FileCheck %s
+
+// Regression test for GitHub #2377, where conversions of negative integers to
+// 16-bit float types would use unsigned-to-float conversion and overflow to undef.
+
+float4 main() : OUT
+{
+  // CHECK: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float -1.000000e+00)
+  // CHECK: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float -1.000000e+00)
+  // CHECK: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float -1.000000e+00)
+  // CHECK: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float -1.000000e+00)
+  return float4(min16float(-1), half(-1), float(-1), double(-1));
+}