-
Notifications
You must be signed in to change notification settings - Fork 102
Open
Description
Hey!
I'm making a compiler which will use LLVM as its backend. But while I was doing some tests, I saw that LLVM, for some reason, was transforming any integer types (i8, i16, i32 or i64) to floats (more precisely, ppc_fp128). But some other types like double work and are not converted to floats (since doubles can hold decimals already).
What I don't understand is that I'm not using any decimal values, and it is still converting them into floats, which actually breaks my code.
Here is a sample demo which does this behavior:
unsafe
{
LLVMModuleRef module = LLVM.ModuleCreateWithName((sbyte*)0);
LLVMBuilderRef builder = LLVM.CreateBuilder();
const string targetStr = "x86_64-unknown-none";
LLVM.InitializeX86TargetInfo();
LLVM.InitializeX86Target();
LLVM.InitializeX86TargetMC();
LLVM.InitializeX86AsmParser();
LLVM.InitializeX86AsmPrinter();
module.Target = targetStr;
var target = LLVMTargetRef.GetTargetFromTriple(targetStr);
var machine = target.CreateTargetMachine(targetStr, "generic", "", LLVMCodeGenOptLevel.LLVMCodeGenLevelNone,
LLVMRelocMode.LLVMRelocStatic, LLVMCodeModel.LLVMCodeModelKernel);
LLVM.SetModuleDataLayout(module, machine.CreateTargetDataLayout());
var function = module.AddFunction("main", LLVM.FunctionType(LLVM.VoidType(), null, 0, 0));
var stack = new Stack<LLVMValueRef>();
LLVM.SetLinkage(function, LLVMLinkage.LLVMExternalLinkage);
builder.PositionAtEnd(function.AppendBasicBlock("entry"));
// Simulating what the stack would look like before Add
stack.Push(LLVM.ConstReal(LLVM.Int32Type(), 8));
stack.Push(LLVM.ConstReal(LLVM.Int32Type(), 4));
var value2 = stack.Pop();
var value1 = stack.Pop();
stack.Push(builder.BuildAdd(value1, value2));
fixed (LLVMOpaqueType** ptr = new[] { LLVM.Int32Type() })
{
var tmp = module.AddFunction("tmp", LLVM.FunctionType(LLVM.VoidType(), ptr, 1, 0));
LLVM.SetLinkage(tmp, LLVMLinkage.LLVMExternalLinkage);
builder.BuildCall(tmp, new[] { stack.Pop() /* This should be the result of the previous Add instruction */ });
}
builder.BuildRetVoid();
LLVM.DumpModule(module);
}Here is the LLVM IR output:
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-none"
define void @main() {
entry:
call void @tmp(ppc_fp128 add (ppc_fp128 0xM40200000000000000000000000000000, ppc_fp128 0xM40100000000000000000000000000000))
ret void
}
declare void @tmp(i32 %0)I'm not quite sure if this is a bug, or if I'm using LLVM(Sharp) wrong here. Any help would be greatly appreciated!
Metadata
Metadata
Assignees
Labels
No labels