1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[FaultMaps][Docs] Document the ImplicitNullChecks pass.

llvm-svn: 241009
This commit is contained in:
Sanjoy Das 2015-06-29 22:00:30 +00:00
parent 62aaec0b27
commit 7226bf4ba4

View File

@ -52,3 +52,45 @@ The format of this section is
uint32 : HandlerPCOffset
}
}
The ``ImplicitNullChecks`` pass
===============================
The ``ImplicitNullChecks`` pass transforms explicit control flow for
checking if a pointer is ``null``, like:
.. code-block:: llvm
%ptr = call i32* @get_ptr()
%ptr_is_null = icmp i32* %ptr, null
br i1 %ptr_is_null, label %is_null, label %not_null
not_null:
%t = load i32, i32* %ptr
br label %do_something_with_t
is_null:
call void @HFC()
unreachable
to control flow implicit in the instruction loading or storing through
the pointer being null checked:
.. code-block:: llvm
%ptr = call i32* @get_ptr()
%t = load i32, i32* %ptr ;; handler-pc = label %is_null
br label %do_something_with_t
is_null:
call void @HFC()
unreachable
This transform happens at the ``MachineInstr`` level, not the LLVM IR
level (so the above example is only representative, not literal). The
``ImplicitNullChecks`` pass runs during codegen, if
``-enable-implicit-null-checks`` is passed to ``llc``.
The ``ImplicitNullChecks`` pass adds entries to the
``__llvm_faultmaps`` section described above as needed.