| ; 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 | |
| } |