1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00
llvm-mirror/test/Transforms/JumpThreading/phi-copy-to-pred.ll
Juneyoung Lee 1112f9ad6f [JumpThreading] Allow duplicating a basic block into preds when its branch condition is freeze(phi)
This is the last JumpThreading patch for getting the performance numbers shown at
https://reviews.llvm.org/D84940#2184653 .

This patch makes ProcessBlock call ProcessBranchOnPHI when the branch condition
is freeze(phi) as well (originally it calls the function when the condition is
phi only).

Since what ProcessBranchOnPHI does is to duplicate the basic block into
predecessors if profitable, it is still valid when the condition is freeze(phi)
too.

```
    p = phi [a, pred1] [b, pred2]
    p.fr = freeze p
    br p.fr, ...
=>
  pred1:
    p.fr = freeze a
    br p.fr, ...
  pred2:
    p.fr2 = freeze b
    br p.fr2, ...
```

Reviewed By: efriedma

Differential Revision: https://reviews.llvm.org/D85029
2020-08-06 09:51:17 +09:00

70 lines
1.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -jump-threading -S < %s | FileCheck %s
declare void @f()
declare void @g()
declare void @h()
define i32 @test(i1 %cond, i1 %a, i1 %b) {
; CHECK-LABEL: @test(
; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]]
; CHECK: A:
; CHECK-NEXT: call void @f()
; CHECK-NEXT: br i1 [[A:%.*]], label [[EXIT1:%.*]], label [[EXIT2:%.*]]
; CHECK: C:
; CHECK-NEXT: call void @g()
; CHECK-NEXT: br i1 [[B:%.*]], label [[EXIT1]], label [[EXIT2]]
; CHECK: EXIT1:
; CHECK-NEXT: ret i32 0
; CHECK: EXIT2:
; CHECK-NEXT: ret i32 1
;
br i1 %cond, label %A, label %B
A:
call void @f()
br label %C
B:
call void @g()
br label %C
C:
%p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed
br i1 %p, label %EXIT1, label %EXIT2
EXIT1:
ret i32 0
EXIT2:
ret i32 1
}
define i32 @test2(i1 %cond, i1 %a, i1 %b) {
; CHECK-LABEL: @test2(
; CHECK-NEXT: br i1 [[COND:%.*]], label [[A:%.*]], label [[C:%.*]]
; CHECK: A:
; CHECK-NEXT: call void @f()
; CHECK-NEXT: [[P_FR1:%.*]] = freeze i1 [[A:%.*]]
; CHECK-NEXT: br i1 [[P_FR1]], label [[EXIT1:%.*]], label [[EXIT2:%.*]]
; CHECK: C:
; CHECK-NEXT: call void @g()
; CHECK-NEXT: [[P_FR:%.*]] = freeze i1 [[B:%.*]]
; CHECK-NEXT: br i1 [[P_FR]], label [[EXIT1]], label [[EXIT2]]
; CHECK: EXIT1:
; CHECK-NEXT: ret i32 0
; CHECK: EXIT2:
; CHECK-NEXT: ret i32 1
;
br i1 %cond, label %A, label %B
A:
call void @f()
br label %C
B:
call void @g()
br label %C
C:
%p = phi i1 [%a, %A], [%b, %B] ; Check that this is removed
%p.fr = freeze i1 %p
br i1 %p.fr, label %EXIT1, label %EXIT2
EXIT1:
ret i32 0
EXIT2:
ret i32 1
}