<div dir="ltr">Because %val doesn't exist (really!).<div>In the actual IR, left hand sides do not exist.</div><div><br></div><div>The Value * (i32 1 in this case) is really linked directly into it's users as a use.</div><div><br></div><div>So something like</div><div><br></div><div>declare foo(%a, %b)</div><div><br></div><div>%c = add  i32 %a, %b</div><div>%d = add i32 %ic, %a</div><div>ret i32 %d</div><div><br></div><div>really looks like this:<br><br></div><div><br></div><div>ret <operand points to add i32 <operand points to add i32 <operand points to argument %a>, <operand points to argument %b>>, <operand points to argument %a>></div><div><br></div><div>To give a statement ordering and basic blocks, they are intrusive-linked-list'd together into basic blocks.   But the LHS still doesn't exist, even in that form.</div><div><div><br></div><div>There are no "declaration" operations, so you can't have an *instruction* that is just a value itself because it's only point would be to produce an LHS, and as we said, LHS's don't really exist.</div><div><br></div></div><div>Instead, because Value * supports both SSA values and constants, every user would just have a use pointing to an i32 1 directly.  </div><div><br></div><div>So in this case, the fake LHS abstraction llvm assembly provides is just being exposed a bit.  </div><div>In producing the IR, anything that isa<Constant>, you should just use directly as an operand to wherever it needs to go.</div><div><br></div><div><br><div><div><br></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 8, 2016 at 2:54 AM, Paul Peet via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">This looks much better than using "select i1 true, i32 1, i32 0".<div>But since something like that (bitcast constant) is allowed why isn't it possible to simply do this:</div><div>%val = i32 1</div><div>?</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">2016-02-08 7:45 GMT+01:00 David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span>On Sun, Feb 7, 2016 at 3:00 PM, Paul Peet via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br></span><div><div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello,<div><br></div><div>I am currently trying to translate some custom IR to LLVM-IR and came across and issue.</div><div>The custom IR has several registers and I am basically try to SSAfy it so it can be easily translated/converted to LLVM-IR.</div><div><br></div><div>The problem:</div><div><br></div><div>Since in my custom IR I can reassign every register I have to reassign every new expression with a new llvm Value. But my IR has something like this:</div><div><br></div><div>REG A = VAR C + CONST 2</div><div>REG A = CONST 12</div><div><br></div><div>So my workaround looks like:</div><div><br></div><div>; I am returning the registers in an anonymous struct</div><div><div>define { i32, i32, i32 } @test(i32 %var_c) {</div><div>  ; Initializing registers</div><div>  %reg_a_0 = select i1 true, i32 0, i32 0</div><div>  %reg_b_0 = select i1 true, i32 0, i32 0</div><div>  %reg_c_0 = select i1 true, i32 0, i32 0</div><div><br></div><div>  ; Translated instructions</div><div>  %reg_a_1 = add i32 %var_c, 2</div><div>  %reg_a_2 = select i1 true, i32 12, i32 0</div><div><br></div><div>  ; Prepare return values</div><div>  %ret_0 = insertvalue { i32, i32, i32 } undef, i32 %reg_a_2, 0</div><div>  %ret_1 = insertvalue { i32, i32, i32 } %ret_0, i32 %reg_b_0, 1</div><div>  %ret_2 = insertvalue { i32, i32, i32 } %ret_1, i32 %reg_c_0, 2</div><div>  </div><div>  ret { i32, i32, i32 } %ret_2</div><div>}</div></div><div><br></div><div>I am basically using "select i1 true, i32 1, i32 0" so after optimization it gets:</div><div>%val = i32 1</div><div><br></div><div>But as I said this looks like a hack to me and I can't simply use "%val = i32 1".</div><div>So what's the proper way to do this without actually using alloca/load/store.</div></div></blockquote><div><br></div></div></div><div>You can use trivial bitcasts if you want to avoid load/store/alloca and you want SSA variables for your constants:</div><div>  %val = bitcast i32 1 to i32</div><span><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>Regards,</div><div>Paul</div></div>
<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></span></div><br></div></div>
</blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>