Skip to content

Commit 7e3137f

Browse files
Greg Rothllvm-beanz
authored andcommitted
Fix wrong mul type and tighted up dot() testing
Was using int dot for the float operands as it was originally an int-only lowering function.
1 parent c7fd761 commit 7e3137f

2 files changed

Lines changed: 16 additions & 11 deletions

File tree

lib/HLSL/HLOperationLower.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2517,12 +2517,16 @@ Value *ExpandDot(Value *arg0, Value *arg1, unsigned vecSize, hlsl::OP *hlslOP,
25172517
DXIL::OpCode MadOpCode = DXIL::OpCode::IMad) {
25182518
Value *Elt0 = Builder.CreateExtractElement(arg0, (uint64_t)0);
25192519
Value *Elt1 = Builder.CreateExtractElement(arg1, (uint64_t)0);
2520-
Value *Result = Builder.CreateMul(Elt0, Elt1);
2520+
Value *Result;
2521+
if (Elt0->getType()->isFloatingPointTy())
2522+
Result = Builder.CreateFMul(Elt0, Elt1);
2523+
else
2524+
Result = Builder.CreateMul(Elt0, Elt1);
25212525
for (unsigned Elt = 1; Elt < vecSize; ++Elt) {
25222526
Elt0 = Builder.CreateExtractElement(arg0, Elt);
25232527
Elt1 = Builder.CreateExtractElement(arg1, Elt);
2524-
Result = TrivialDxilTrinaryOperation(MadOpCode, Elt0, Elt1, Result, hlslOP,
2525-
Builder);
2528+
Result =
2529+
TrivialDxilTrinaryOperation(MadOpCode, Elt0, Elt1, Result, OP, Builder);
25262530
}
25272531

25282532
return Result;

tools/clang/test/CodeGenDXIL/hlsl/types/longvec-scalarized-intrinsics.hlsl

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,15 @@ float4 main(uint i : SV_PrimitiveID, bool b : B) : SV_Target {
104104
// CHECK: fsub fast <8 x float>
105105
vec1 = modf(vec1, vec2);
106106

107-
// CHECK: fmul fast float
108-
// CHECK: call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float %{{.*}}) ; FMad(a,b,c)
109-
// CHECK: call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float %{{.*}}) ; FMad(a,b,c)
110-
// CHECK: call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float %{{.*}}) ; FMad(a,b,c)
111-
// CHECK: call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float %{{.*}}) ; FMad(a,b,c)
112-
// CHECK: call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float %{{.*}}) ; FMad(a,b,c)
113-
// CHECK: call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float %{{.*}}) ; FMad(a,b,c)
114-
// CHECK: call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float %{{.*}}) ; FMad(a,b,c)
107+
// CHECK: [[el:%.*]] = extractelement <8 x float>
108+
// CHECK: [[mul:%.*]] = fmul fast float [[el]]
109+
// CHECK: [[ping:%.*]] = call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float [[mul]]) ; FMad(a,b,c)
110+
// CHECK: [[pong:%.*]] = call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float [[ping]]) ; FMad(a,b,c)
111+
// CHECK: [[ping:%.*]] = call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float [[pong]]) ; FMad(a,b,c)
112+
// CHECK: [[pong:%.*]] = call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float [[ping]]) ; FMad(a,b,c)
113+
// CHECK: [[ping:%.*]] = call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float [[pong]]) ; FMad(a,b,c)
114+
// CHECK: [[pong:%.*]] = call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float [[ping]]) ; FMad(a,b,c)
115+
// CHECK: [[ping:%.*]] = call float @dx.op.tertiary.f32(i32 46, float %{{.*}}, float %{{.*}}, float [[pong]]) ; FMad(a,b,c)
115116
vec1 = dot(vec1, vec2);
116117

117118
vector<bool, 8> bvec = b;

0 commit comments

Comments
 (0)