
The LIT test cases were migrated with the script provided by Nikita Popov. No manual changes were made. Committed without review since no functional changes, after consultation with uweigand.
71 lines
2.0 KiB
LLVM
71 lines
2.0 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, ptr %rmin, ptr %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, ptr %rmin, align 8
|
|
store double %max, ptr %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
|
|
}
|