<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Jun 5, 2016 at 11:27 PM, Han Wang 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi,<br>
<br>
Apologize if this is a dumb question, I am new to LLVM.<br>
<br>
I would like to use LLVM-IR to as an intermediate language to generate stream processing hardware</blockquote><div><br></div><div>I assume you mean "to generate CODE FOR stream processing hardware.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"> <br></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Basically, at the very least, I would like to be able to input a stream of bytes into IR, and perform<br>
some operations on the bytes and output the stream bytes from IR.<br>
<br>
I am thinking of using the `load` and `store` instructions for the IO task, but I am not sure<br>
how to make the `load` instruction to load continuous stream of bytes from a memory address.<br>
<br>
To some extent, it is similar to use `load` to read from a memory mapped IO address to receive<br>
different bytes each time.<br>
<br>
I wonder if anyone has done similar things before, any pointer or suggestion would be much appreciated.<br></blockquote><div><br></div><div>Unless I misunderstand you, memory mapped IO is exactly what you want.</div><div><br></div><div>The main thing is to prevent the optimizer from thinking that different loads will return the same value and removing them, or assuming that later stores will overwrite earlier stores and remove the earlier stores.</div><div><br></div><div>i.e. C code like this will work:</div><div><br></div><div><div>void stream(){</div><div>  volatile char *IN = (char*)0x100;</div><div>  volatile char *OUT = (char*)0x101;  </div><div>  while (1) *OUT = *IN;</div><div>}</div></div><div><br></div><div>You can look at what clang creates from this, and generate similar IR yourself</div><div><br></div><div>clang -S -Os stream.c -o stream.s -emit-llvm<br></div><div><br></div><div><div>define void @stream() #0 {</div><div>  br label %1</div><div><br></div><div>; <label>:1                                       ; preds = %0, %1</div><div>  %2 = load volatile i8* inttoptr (i64 256 to i8*), align 256, !tbaa !1</div><div>  store volatile i8 %2, i8* inttoptr (i64 257 to i8*), align 1, !tbaa !1</div><div>  br label %1</div><div>}</div></div><div><br></div></div></div></div>