Skip to content

Commit

Permalink
remove unneeded fpext when doing ops on 2 floats (dotnet#7247)
Browse files Browse the repository at this point in the history
  • Loading branch information
yowl authored and MichalStrehovsky committed Apr 3, 2019
1 parent b1b3f53 commit 614fb3b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/ILCompiler.WebAssembly/src/CodeGen/EvaluationStack.cs
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ public LLVMValueRef ValueForStackKind(StackValueKind kind, LLVMBuilderRef builde
else if (kind == StackValueKind.Int64)
return ValueAsInt64(builder, signExtend);
else if (kind == StackValueKind.Float)
return ValueAsType(LLVM.DoubleType(), builder);
return ValueAsType(Type.IsWellKnownType(WellKnownType.Single) ? LLVM.FloatType() : LLVM.DoubleType(), builder);
else if (kind == StackValueKind.NativeInt || kind == StackValueKind.ByRef || kind == StackValueKind.ObjRef)
return ValueAsInt32(builder, false);
else
Expand Down
24 changes: 24 additions & 0 deletions src/ILCompiler.WebAssembly/src/CodeGen/ILToWebAssemblyImporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2553,6 +2553,14 @@ private void ImportBranch(ILOpcode opcode, BasicBlock target, BasicBlock fallthr
}
else
{
if (op1.Type.IsWellKnownType(WellKnownType.Double) && op2.Type.IsWellKnownType(WellKnownType.Single))
{
left = LLVM.BuildFPExt(_builder, left, LLVM.DoubleType(), "fpextop2");
}
else if (op2.Type.IsWellKnownType(WellKnownType.Double) && op1.Type.IsWellKnownType(WellKnownType.Single))
{
right = LLVM.BuildFPExt(_builder, right, LLVM.DoubleType(), "fpextop1");
}
switch (opcode)
{
case ILOpcode.beq:
Expand Down Expand Up @@ -2690,6 +2698,14 @@ private void ImportBinaryOperation(ILOpcode opcode)
LLVMValueRef right = op1.ValueForStackKind(kind, _builder, false);
if (kind == StackValueKind.Float)
{
if(op1.Type.IsWellKnownType(WellKnownType.Double) && op2.Type.IsWellKnownType(WellKnownType.Single))
{
left = LLVM.BuildFPExt(_builder, left, LLVM.DoubleType(), "fpextop2");
}
else if (op2.Type.IsWellKnownType(WellKnownType.Double) && op1.Type.IsWellKnownType(WellKnownType.Single))
{
right = LLVM.BuildFPExt(_builder, right, LLVM.DoubleType(), "fpextop1");
}
switch (opcode)
{
case ILOpcode.add:
Expand Down Expand Up @@ -2908,6 +2924,14 @@ private void ImportCompareOperation(ILOpcode opcode)
}
else
{
if (op1.Type.IsWellKnownType(WellKnownType.Double) && op2.Type.IsWellKnownType(WellKnownType.Single))
{
typeSaneOp2 = LLVM.BuildFPExt(_builder, typeSaneOp2, LLVM.DoubleType(), "fpextop2");
}
else if (op2.Type.IsWellKnownType(WellKnownType.Double) && op1.Type.IsWellKnownType(WellKnownType.Single))
{
typeSaneOp1 = LLVM.BuildFPExt(_builder, typeSaneOp1, LLVM.DoubleType(), "fpextop1");
}
switch (opcode)
{
case ILOpcode.ceq:
Expand Down

0 comments on commit 614fb3b

Please sign in to comment.