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: [email protected]
          Reporter: [email protected]
                CC: [email protected]

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.
_______________________________________________
llvm-bugs mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to