[LLVMdev] Need help in converting int to double

James Molloy
Thu, 22 Sep 2011 10:32:44 -0000

Hi Sarath,

It would have really helped if you had removed the commented out code and
inlined the calls to your homemade helper functions before sending it...

You are doing this, in LLVM IR:

%0 = getelementptr %Value*  %firstArg, i32 0  ; i8**
%1 = load i8** %0 ; i8*
%2 = bitcast i8* %1 to i64*
%3 = getelementptr %Value* %secondArg, i32 0 ; i8**
%4 = load i8** %3; i8*
%5 = bitcast i8* %4 to i64*

%6 = load i64* %2
%7 = load i64* %5

Then you call convertDoubleToInt64().  What does this actually do?
It's in trouble by this point because it needs to do a fptosi on a double
operand, but you've got an i64 operand and you can't reinterpret-cast
ints to floats in LLVM IR (AFAIK)

I can't see what your code is doing afterwards as it uses calls to helper
functions that you haven't included.

The main point I'd raise is: if your value is stored as a double inside the
Value structure, then why are you bitcasting to i64*? Why not bitcast to double*
then load and perform a proper fptosi?

Cheers,

James

From: sarath chandra [mailto:sarathcse19 at gmail.com]
Sent: 22 September 2011 11:18
To: James Molloy; llvmdev at cs.uiuc.edu
Subject: Re: [LLVMdev] Need help in converting int to double


On Thu, Sep 22, 2011 at 3:46 PM, sarath chandra <sarathcse19 at
gmail.com<mailto:sarathcse19 at gmail.com>> wrote:
Hi James,

First i converted the void * to int* and then did FPToSI...then did SHL...(
because CreateShl only accepts integers... i pointer casted it to int64 type
first)... Below is the code snippet....


lhs = mBuilder.CreateStructGEP(firstArg, 0);
    lhs = mBuilder.CreateLoad(lhs);
    lhs = mBuilder.CreatePointerCast(lhs, PointerType::get(
            mBuilder.getInt64Ty(), 0));
    int typelhs = getValueType(lhs);
    rhs = mBuilder.CreateStructGEP(secondArg, 0);
    rhs = mBuilder.CreateLoad(rhs);
    rhs = mBuilder.CreatePointerCast(rhs, PointerType::get(
            mBuilder.getInt64Ty(), 0));

    lhs = mBuilder.CreateLoad(lhs);
    rhs = mBuilder.CreateLoad(rhs);

    lhs = convertDoubleToInt64(lhs); // used FPToSI
    rhs = convertDoubleToInt64(rhs);//    "         "

    //lhs = mBuilder.CreateLoad(lhs);
    //rhs = mBuilder.CreateLoad(rhs);

    lhs = mBuilder.CreateShl(lhs, rhs);
    //lhs = mBuilder.CreatePointerCast(lhs,
PointerType::get(mBuilder.getDoubleTy(),0));
    lhs = convertIntToDouble(lhs);
    typelhs = getValueType(lhs);



    llvm::Value* returnValue = mBuilder.CreateAlloca(PointerType::get(
            mModule->getTypeByName("Value"), 0));

    llvm::Value* valueStructSize = getValueStructSize();
    llvm::Value* memory = insertCallToMalloc(valueStructSize);

    memory = mBuilder.CreatePointerCast(memory, PointerType::get(
            mModule->getTypeByName("Value"), 0));

    mBuilder.CreateStore(memory, returnValue);

    allocateAndAssignDoubleTypeVar(mBuilder.CreateLoad(returnValue), lhs);

    //return the value
    mBuilder.CreateRet(mBuilder.CreateLoad(returnValue));


    /*
     * create call to SHL function
     */
    mCurrentFunction = previousFunction;
    mBuilder.SetInsertPoint(previousBlock);

    return mBuilder.CreateCall2(shlFunction, aLHS, aRHS);


On Thu, Sep 22, 2011 at 3:40 PM, James Molloy <James.Molloy at
arm.com<mailto:James.Molloy at arm.com>> wrote:
Hi Sarath,

Your example will break.

If the values are held internally as doubles casted to void* (which incidentally
will only work on 64-bit systems), just casting void* -> int* will not get
you a valid integer value. It will get you the double's internal
representation as an integer. For example (actual values are made up):

   double a = 42.0;
   void *v = (void*)&a;
   int b = *(int*)v;

"b" will not contain 42. It will contain what looks like random
garbage (although it is the IEE754 floating point representation of
"42.0").

You need to perform an actual cast:

   double a  = 42.0;
   void *v = (void*)&a;
   double b = *(double*)v;
   int c = (int)b;

"c" will contain 42.

In LLVM speak, you need to LOAD as a double*, perform a fptosi to create an
int64, perform the shift, then sitofp and store:

%1 = load bitcast i8* %arg0 to double*  ; Cast the void* to double*, then load
it.
%2 = load bitcast i8* %arg1 to double*

%3 = fptosi double %1 to i64 ; Perform explicit double -> int conversion.
%4 = fptosi double %2 to i64

%5 = shr i64 %3, %4 ; Perform your operation.

%6 = sitofp i64 %5 to double ; Convert explicitly back to integer
representation.

%7 = store bitcast i8* %dest to double*, double %6 ; Store back, reinterpreting
your void* (which is i8* in LLVM) as a double*.


Hopefully this makes sense, especially if you know how you would have to do it
in C.

Cheers,

James

From: sarath chandra [mailto:sarathcse19 at gmail.com<mailto:sarathcse19 at
gmail.com>]
Sent: 22 September 2011 10:49
To: James Molloy
Subject: Re: [LLVMdev] Need help in converting int to double

Hi James,

   CreateShl() accepts only integers or vectors as arguments. At the starting my
arguments , let us suppose LHS,RHS, are double values. To pass them as arguments
to CreateShl(), i used Pointer Casting to convert the Void* to Int*. Now the
problem is after getting the result is, the result variable which captures the
output is Int*.. i wanted to make it Double*..(so that i can accomadate it in
value structure)
On Thu, Sep 22, 2011 at 3:12 PM, James Molloy <James.Molloy at
arm.com<mailto:James.Molloy at arm.com>> wrote:
Hi Sarath,

If you can only hold doubles (not integers), and you originally converted the
doubles to integers to do an integer shift, why can you not just convert the
result back to a double using CreateFPToSI ?

CreateFPToSI(CreateShr(CreateSIToFP(arg0), CreateSIToFP(arg1)))

Cheers,

James

From: llvmdev-bounces at cs.uiuc.edu<mailto:llvmdev-bounces at
cs.uiuc.edu> [mailto:llvmdev-bounces at cs.uiuc.edu<mailto:llvmdev-bounces
at cs.uiuc.edu>] On Behalf Of sarath chandra
Sent: 22 September 2011 10:37
To: llvmdev at cs.uiuc.edu<mailto:llvmdev at cs.uiuc.edu>
Subject: [LLVMdev] Need help in converting int to double

Hi,

    I'm pursuing M.Tech course. As a part of the project work i'm using
LLVM as back-end. My project area is "Enhancing the performance of V8
javascript engine using LLVM as a back-end".

   Now i'm writing code for shift left(SHL) operator. I had my own Value
Structure .. it's like this

Struct Value
{
void *val  ;
char type;
}

 The "char type" holds
DoubleType,DoubleConst,StringType,StringConst...

 when i'm executing the IrBuilder.CreateShl(LHS,RHS) instruction it is
returning an integer value as output.. i'm unable to store the value in my
structure....(because my structure can hold Doubles,Strings).

 Is there any way to store the integer output in my structure( i used
CreateSIToFP() to change int to double)........

Thanks in advance

Regards,

 (¨`·.·´¨)
  `·.¸(¨`·.·´¨)
 (¨`·.·´¨)¸.·´ Sarath!!!
   `·.¸.·´

-- IMPORTANT NOTICE: The contents of this email and any attachments are
confidential and may also be privileged. If you are not the intended recipient,
please notify the sender immediately and do not disclose the contents to any
other person, use it for any purpose, or store or copy the information in any
medium. Thank you.



--
Sairam,

 (¨`·.·´¨)
  `·.¸(¨`·.·´¨)
 (¨`·.·´¨)¸.·´ Sarath!!!
   `·.¸.·´

-- IMPORTANT NOTICE: The contents of this email and any attachments are
confidential and may also be privileged. If you are not the intended recipient,
please notify the sender immediately and do not disclose the contents to any
other person, use it for any purpose, or store or copy the information in any
medium.  Thank you.


--
Sairam,

  (¨`·.·´¨)
   `·.¸(¨`·.·´¨)
  (¨`·.·´¨)¸.·´ Sarath!!!
    `·.¸.·´



--
Sairam,

  (¨`·.·´¨)
   `·.¸(¨`·.·´¨)
  (¨`·.·´¨)¸.·´ Sarath!!!
    `·.¸.·´

-- IMPORTANT NOTICE: The contents of this email and any attachments are
confidential and may also be privileged. If you are not the intended recipient,
please notify the sender immediately and do not disclose the contents to any
other person, use it for any purpose, or store or copy the information in any
medium. Thank you.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20110922/2f005ce0/attachment.html>