Skip to content

Commit 907cdba

Browse files
author
Greg Roth
committed
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 3f7b108 commit 907cdba

2 files changed

Lines changed: 14 additions & 9 deletions

File tree

lib/HLSL/HLOperationLower.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2510,7 +2510,11 @@ Value *ExpandDot(Value *Arg0, Value *Arg1, unsigned VecSize, hlsl::OP *OP,
25102510
DXIL::OpCode MadOpCode = DXIL::OpCode::IMad) {
25112511
Value *Elt0 = Builder.CreateExtractElement(Arg0, (uint64_t)0);
25122512
Value *Elt1 = Builder.CreateExtractElement(Arg1, (uint64_t)0);
2513-
Value *Result = Builder.CreateMul(Elt0, Elt1);
2513+
Value *Result;
2514+
if (Elt0->getType()->isFloatingPointTy())
2515+
Result = Builder.CreateFMul(Elt0, Elt1);
2516+
else
2517+
Result = Builder.CreateMul(Elt0, Elt1);
25142518
for (unsigned Elt = 1; Elt < VecSize; ++Elt) {
25152519
Elt0 = Builder.CreateExtractElement(Arg0, Elt);
25162520
Elt1 = Builder.CreateExtractElement(Arg1, Elt);

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)