[llvm-bugs] [Bug 32784] New: Multiple returns are not canonicalized to a single return
via llvm-bugs
llvm-bugs at lists.llvm.org
Tue Apr 25 02:30:20 PDT 2017
https://bugs.llvm.org/show_bug.cgi?id=32784
Bug ID: 32784
Summary: Multiple returns are not canonicalized to a single
return
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: Transformation Utilities
Assignee: unassignedbugs at nondot.org
Reporter: me at manueljacob.de
CC: llvm-bugs at lists.llvm.org
The patch for PR8575 stopped canonicalizing in the other direction, but other
than the bug title suggests, a canonicalization from multiple returns to a
single return was never implemented.
There are examples where this canonicalization would enable other
optimizations. For example, this isn't optimized further:
define void @test(i1 %cond, i64* %ptr1, i64* %ptr2, i64 %value) {
br i1 %cond, label %true_block, label %false_block
true_block:
store i64 %value, i64* %ptr1
ret void
false_block:
store i64 %value, i64* %ptr2
ret void
}
Changing the function to have a single return...
define void @test(i1 %cond, i64* %ptr1, i64* %ptr2, i64 %value) {
br i1 %cond, label %true_block, label %false_block
true_block:
store i64 %value, i64* %ptr1
br label %join
false_block:
store i64 %value, i64* %ptr2
br label %join
join:
ret void
}
... enables common instruction sinking:
define void @test(i1 %cond, i64* nocapture %ptr1, i64* nocapture %ptr2, i64
%value) local_unnamed_addr #0 {
join:
%ptr2.sink = select i1 %cond, i64* %ptr1, i64* %ptr2
store i64 %value, i64* %ptr2.sink, align 8
ret void
}
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170425/c77230ca/attachment-0001.html>
More information about the llvm-bugs
mailing list