1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00
llvm-mirror/test/CodeGen/SystemZ/multiselect.ll
Jonas Paulsson bf5edcf100 [SystemZ] Improve emitSelect()
Merge more Select pseudo instructions in emitSelect() by allowing other
instructions between them as long as they do not clobber CC.

Debug value instructions are now moved down to below the new PHIs instead of
erasing them.

Review: Ulrich Weigand
https://reviews.llvm.org/D67619

llvm-svn: 372873
2019-09-25 14:00:33 +00:00

71 lines
2.1 KiB
LLVM

; Test that multiple select statements using the same condition are expanded
; into a single conditional branch when possible.
;
; RUN: llc < %s -mtriple=s390x-linux-gnu -disable-block-placement | FileCheck %s
define void @test0(i32 signext %positive, double %base, double %offset, double* %rmin, double* %rmax) {
entry:
; CHECK-LABEL: test0
; CHECK: cijlh %r2, 0,
; CHECK-NOT: cij
; CHECK-NOT: je
; CHECK-NOT: jlh
%tobool = icmp eq i32 %positive, 0
%add = fadd double %base, %offset
%min = select i1 %tobool, double %add, double %base
%max = select i1 %tobool, double %base, double %add
store double %min, double* %rmin, align 8
store double %max, double* %rmax, align 8
ret void
}
; Two selects with an intervening instruction that doesn't clobber CC can
; still be merged.
define double @test1(i32 signext %positive, double %A, double %B, double %C) {
entry:
; CHECK-LABEL: test1
; CHECK: cijhe {{.*}}LBB1_2
; CHECK-NOT: cij
; CHECK: br %r14
%tobool = icmp slt i32 %positive, 0
%s1 = select i1 %tobool, double %A, double %B
%mul = fmul double %A, %B
%s2 = select i1 %tobool, double %B, double %C
%add = fadd double %s1, %s2
%add2 = fadd double %add, %mul
ret double %add2
}
; Two selects with an intervening user of the first select can't be merged.
define double @test2(i32 signext %positive, double %A, double %B) {
entry:
; CHECK-LABEL: test2
; CHECK: cije {{.*}}LBB2_2
; CHECK: cibe {{.*}}%r14
; CHECK: br %r14
%tobool = icmp eq i32 %positive, 0
%s1 = select i1 %tobool, double %A, double %B
%add = fadd double %A, %s1
%s2 = select i1 %tobool, double %A, double %add
ret double %s2
}
; Two selects with different conditions can't be merged
define double @test3(i32 signext %positive, double %A, double %B, double %C) {
entry:
; CHECK-LABEL: test3
; CHECK: cijl {{.*}}LBB3_2
; CHECK: cijl {{.*}}LBB3_4
; CHECK: br %r14
%tobool = icmp slt i32 %positive, 0
%s1 = select i1 %tobool, double %A, double %B
%tobool2 = icmp slt i32 %positive, 2
%s2 = select i1 %tobool2, double %B, double %C
%add = fadd double %s1, %s2
ret double %add
}