<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hi,<br><br></div><div>I need to control IRBuilder(or manage IR building with other means) very strictly. The problem is in the realm of ConstInt/GlobalVariable handling, more precisely:<br>
          

</div><div>
<p>LLVM converts llvm::ConstantInt values to GlobalVariable addresses ad-hoc if I store a constant in a GlobalVariable, 
and it appears to me, that I can do nothing about it. Consider the 
following, shortened code:<br>
...<br>
0x18:    r2 = memread(0x4000)<br>
0x1C:    r3 = memread(0x4004)<br>
0x20:    r4 = add(r2, r3)<br>
...<br>
Gets translated to:<br>  %v0_18 = load i32, i32* inttoptr (i32 16384 to i32*), align 16384<br>  %v0_20 = load i32, i32* inttoptr (i32 16388 to i32*), align 4<br>  %v2_24 = add i32 %v0_20, %v0_18 <br>
which is absolutely fine, however, in another binary:<br>
...<br>
0x800004:    r2 = memread(0x4000)<br>
0x800008:    r3 = memread(0x4004)<br>
0x80000C:    r6 = 0x4020<br>
0x800010:    r1 = logic_shift_right(r6, 3)<br>
0x800014:    r4 = add(r2, r3)<br>
...<br>
Gets translated to:<br></p><p>@global_var_4020.3 = global i32 0<br>@global_var_4000.4 = local_unnamed_addr global i32 0<br>@global_var_4004.5 = local_unnamed_addr global i32 0 <br></p><p>...<br></p><p>%v0_800004 = load i32, i32* @global_var_4400.1, align 4<br>%v0_800008 = load i32, i32* @global_var_4404.2, align 4<br>%v0_800010 = lshr (i32 ptrtoint (i32* @global_var_4020.3 to i32), i32 3)<br>%v2_800014 = add i32 %v0_800008, %v0_800004  <br></p><p>
...<br></p><p>The funny thing, as you can see, 
 is that now the address range is nowhere near 0x4000(just like in the 
previous example). But LLVM uses global variables, which happen to have 
the correct addresses. Even more strange 
is, that for a bit shifting operation a global variable address is used as operand.
<br><br></p><p>The IRBuilder code for the memread instruction is the following for both cases(simplified version):</p><p>    int
constVal

= param1;<br>    llvm::IRBuilder<>& irb;<br>    llvm::Value* op1 = llvm::ConstantInt::getSigned(irb.getInt32Ty(), constVal);<br>    auto* pt = llvm::PointerType::get(op1->getType(), 0);

<br>    auto* addr = irb.CreateIntToPtr(op1, pt);<br>    auto* loaded = irb.CreateLoad(addr);<br>    irb.CreateStore(loaded, module->getNamedGlobal(regname));</p><p>
I cannot get LLVM to leave an llvm::Value as ConstantInt in every case, if I pass it 
to IRBuilder for processing(for example through a globalvariable storing 
instruction).<br>
Do you know how I can tell IRBuilder, or any other part of LLVM, to leave a supplied or retrieved llvm::Value as const?

<br><br></p><p>Best regards,<br></p><p>Norbert<br>
</p>

</div></div></div></div></div></div></div></div></div></div></div></div>