2014-01-22 28 views
2

比方说,我们有一些代码LLVM代码生成:恒定值fptoui指令

%conv = fptoui double -1 to i32

执行转化%后为4294967295确定。但是,当我试图生成这样的代码,我叫

Builder.CreateFPToUI(val, Builder.getInt32Ty())

其中val是ConstantFP其值是-1,则返回ConstantInt其值为0,而不是4294967295!有人可以解释为什么吗?

UPD: Example.Let说,我需要生成IR下一码

a << -1 

代码生成会像水木清华

Value* one; // for 1 literal 
Value* minusOne; // for -1 
Value* a; //represents variable a 
.... 
one = llvm::ConstantFP::get(Builder.getDoubleTy(), 1); 
.... 
/* Negation. CreateFSub also doesn't emits instruction but returns ConstantFP with -1 value */ 
minusOne = CreateFSub(ConstantFP::getZeroValueForNegation(Builder.getDoubleTy()), one); 
.... 
Value* unsignedOne = Builder.CreateFPToUI(minusOne, Builder.getInt32Ty()); 
.... 
Value* shift = Builder.CreateShl(a, unsignedOne, "shl"); 

而这一切,只是变成了

%shl = shl i32 %a, 0 
+0

“返回值为0的constantint” - 您使用什么代码来获取常量值? – Oak

+0

我不需要这个值,所以我只是在调试器中观察它。但是如果你有兴趣获得int值,你可以使用像下面这样的smth:dyn_cast (value) - > getValue()。getWord() – user1215562

回答

0

来自language reference

'fptoui'指令将其浮点操作数转换为最接近(向零舍入)的无符号整数值。 如果该值不适合ty2,则结果未定义为

-1不适合任何无符号整数类型...所以你得到未定义的结果。

如果你想知道如何从同一个IR获得两件不同的东西,那么你应该知道它不是一样的IR:如你所见,IRBuilder::CreateFPToUI调用的结果是一个值(ConstantInt)和不是指令,因为它是不断折叠的。

+0

就我而言,-1适合i32 ty(它不区分signed/unsigned ),所以我给出的IR代码总是返回4294967295,这是正确的。问题是为什么CreateFPToUI返回的值的结果与它发出的指令结果不同? – user1215562