[llvm-experiment] Update README
diff --git a/llvm-codegen/README b/llvm-codegen/README
deleted file mode 100644
index 941abfb..0000000
--- a/llvm-codegen/README
+++ /dev/null
@@ -1,24 +0,0 @@
-A small tutorial on how to use the LLVM code generation tool:
-
-mkdir build
-cd build
-cmake -DTARGET_ARCH=[X64|WASM] ../
-make
-
-Suppose that your dart file is example/main.dart, then run:
-pkg/vm/tool/release_llvm_precompiler example/main
-This will generate a bunch of files in example/:
-main.il -- the serialized IL
-main.llvm -- the LLVM IR in text format
-main.s -- the corresponding assembly
-main.S -- the assembly from the Dart AOT pipeline
-main.dill
-main executable -- the executable from the Dart AOT pipeline
-main.so -- the LLVM executable
-
-Then to run this:
-./out/ReleaseX64/dart_precompiled_runtime --llvm-mode example/main.so
-
-For Wasm running:
-pkg/vm/tool/wasm_precompiler example/main
-Produces a WebAssembly module main.wasm, among other things.
diff --git a/llvm-codegen/README.md b/llvm-codegen/README.md
new file mode 100644
index 0000000..9791035
--- /dev/null
+++ b/llvm-codegen/README.md
@@ -0,0 +1,88 @@
+# How to use LLVM backend
+
+## Prerequisites
+
+You will need LLVM development headers and libraries. Current version of 
+the backend is tested to work against `01b595c0cb78764384be769236af2e23cc11ab52` of 
+`llvm-project` built and installed globally. 
+
+## Building
+
+We are assuming that you have functional Dart SDK checkout, which can be
+obtained by doing `fetch dart` and you checked out `llvm-experiment` branch.
+
+The following targets need to built:
+
+* `vm_platform` - provides Kernel binary with Dart SDK libraries;
+* `gen_snapshot` - provides Dart AOT compiler;
+* `dart_precompiled_runtime` - provides Dart AOT runtime.
+
+```console
+$ tools/build.py -m product -a x64 vm_platform gen_snapshot dart_precompiled_runtime
+```
+
+Note: specifying `product` creates a _product build_ which is considered the
+most minimal runtime environment, excluding features like vmservice, debugging
+and profiling support. You can also use normal `release` and `debug` builds
+for debugging.
+
+Additionally you will need to build LLVM backend, which is currently not
+integrated into GN build:
+
+```console
+$ mkdir out/llvm-codegen
+$ cd out/llvm-codegen
+$ cmake -DTARGET_ARCH=X64 -G Ninja ../../llvm-codegen
+$ ninja
+```
+
+## Testing
+
+Currently LLVM backend supports lowering of a subset of IL instructions 
+which Dart VM AOT compiler can generate. Thus is can't yet compile any 
+application in its entirety. Instead functions that you would like to
+compile through LLVM backend need to be annotated with `@pragma('vm:llvm')`.
+
+Consider the following input file `/tmp/hello.dart`:
+
+```dart
+@pragma('vm:llvm')          // compile this function through LLVM
+@pragma('vm:never-inline')  // prevent inlining of this function into main
+int sum(int start, int end) {
+  final list = <int>[];
+  for (var i = start; i < end; i++) list.add(i * i);
+
+  var sum = 0;
+  for (var elem in list) {
+    sum += elem;
+  }
+  return sum;
+}
+
+void main(List<String> args) {
+  final result = sum(int.parse(args[0]), int.parse(args[1]));
+  print('sum: ${result}');
+}
+```
+
+This file can be compiled using `pkg/vm/tool/release_llvm_precompiler` like so:
+
+```console
+$ DART_CONFIGURATION=ProductX64 pkg/vm/tool/release_llvm_precompiler /tmp/hello
+# This would produce /tmp/hello.so which can be run using precompiled runtime
+$ out/ProductX64/dart_precompiled_runtime --llvm-mode /tmp/hello.so
+```
+
+Note: `.dart` is removed. 
+
+You can pass `-v` or `--verbose` to see the steps that the script is executing.
+
+Script generates the following interpediate files next to the input file:
+
+* `hello.il` the serialized IL;
+* `hello.llvm` the LLVM IR in text format;
+* `hello.s` the corresponding assembly;
+* `hello.S` the assembly from the Dart AOT pipeline;
+* `hello.dill` Kernel binary (AOT optimized);
+* `hello.so` library that contains all necessary snapshots and code
+