[LLVMdev] Optimisation of select/cmp/br
Pete Calvert
prc33 at cam.ac.uk
Tue Feb 4 20:37:48 PST 2014
Hi,
Is there anyway I can coerce LLVM into performing the following
transformation?
%1 = icmp eq i32 %flag, 1
%2 = select i1 %1, %foo* %data, %struct.cell_t* null
%3 = icmp eq %foo* %2, null
br i1 %3, label %failure, label %success
Into:
%1 = icmp eq i32 %flag, 1
br i1 %1, label %success, label %failure
With %data substituted for %2 in %success and its successors, and null
for %2 in %failure. The way that code generation deals with the select
means that this is actually making a small but noticeable difference to
performance due to the number of branches involved.
As way of justification, the code in question essentially comes from a C
function similar to:
foo *check_for_data() {
if(flag == FULL) {
return data;
} else {
return NULL;
}
}
which is called by code that branches on whether the result is NULL.
After inlining and other optimisation passes I'm getting code like that
above.
Best,
Pete
More information about the llvm-dev
mailing list