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