1b32f3656SUlrich Weigand; Test that multiple select statements using the same condition are expanded 2*c5d90e4bSJonas Paulsson; into a single conditional branch when possible. 3b32f3656SUlrich Weigand; 4*c5d90e4bSJonas Paulsson; RUN: llc < %s -mtriple=s390x-linux-gnu -disable-block-placement | FileCheck %s 5b32f3656SUlrich Weigand 6*c5d90e4bSJonas Paulssondefine void @test0(i32 signext %positive, double %base, double %offset, double* %rmin, double* %rmax) { 7b32f3656SUlrich Weigandentry: 8*c5d90e4bSJonas Paulsson; CHECK-LABEL: test0 9b32f3656SUlrich Weigand; CHECK: cijlh %r2, 0, 10b32f3656SUlrich Weigand; CHECK-NOT: cij 11b32f3656SUlrich Weigand; CHECK-NOT: je 12b32f3656SUlrich Weigand; CHECK-NOT: jlh 13b32f3656SUlrich Weigand 14b32f3656SUlrich Weigand %tobool = icmp eq i32 %positive, 0 15b32f3656SUlrich Weigand %add = fadd double %base, %offset 16b32f3656SUlrich Weigand %min = select i1 %tobool, double %add, double %base 17b32f3656SUlrich Weigand %max = select i1 %tobool, double %base, double %add 18b32f3656SUlrich Weigand store double %min, double* %rmin, align 8 19b32f3656SUlrich Weigand store double %max, double* %rmax, align 8 20b32f3656SUlrich Weigand ret void 21b32f3656SUlrich Weigand} 22b32f3656SUlrich Weigand 23*c5d90e4bSJonas Paulsson; Two selects with an intervening instruction that doesn't clobber CC can 24*c5d90e4bSJonas Paulsson; still be merged. 25*c5d90e4bSJonas Paulssondefine double @test1(i32 signext %positive, double %A, double %B, double %C) { 26*c5d90e4bSJonas Paulssonentry: 27*c5d90e4bSJonas Paulsson; CHECK-LABEL: test1 28*c5d90e4bSJonas Paulsson; CHECK: cijhe {{.*}}LBB1_2 29*c5d90e4bSJonas Paulsson; CHECK-NOT: cij 30*c5d90e4bSJonas Paulsson; CHECK: br %r14 31*c5d90e4bSJonas Paulsson 32*c5d90e4bSJonas Paulsson %tobool = icmp slt i32 %positive, 0 33*c5d90e4bSJonas Paulsson %s1 = select i1 %tobool, double %A, double %B 34*c5d90e4bSJonas Paulsson %mul = fmul double %A, %B 35*c5d90e4bSJonas Paulsson %s2 = select i1 %tobool, double %B, double %C 36*c5d90e4bSJonas Paulsson %add = fadd double %s1, %s2 37*c5d90e4bSJonas Paulsson %add2 = fadd double %add, %mul 38*c5d90e4bSJonas Paulsson ret double %add2 39*c5d90e4bSJonas Paulsson} 40*c5d90e4bSJonas Paulsson 41*c5d90e4bSJonas Paulsson; Two selects with an intervening user of the first select can't be merged. 42*c5d90e4bSJonas Paulssondefine double @test2(i32 signext %positive, double %A, double %B) { 43*c5d90e4bSJonas Paulssonentry: 44*c5d90e4bSJonas Paulsson; CHECK-LABEL: test2 45*c5d90e4bSJonas Paulsson; CHECK: cije {{.*}}LBB2_2 46*c5d90e4bSJonas Paulsson; CHECK: cibe {{.*}}%r14 47*c5d90e4bSJonas Paulsson; CHECK: br %r14 48*c5d90e4bSJonas Paulsson 49*c5d90e4bSJonas Paulsson %tobool = icmp eq i32 %positive, 0 50*c5d90e4bSJonas Paulsson %s1 = select i1 %tobool, double %A, double %B 51*c5d90e4bSJonas Paulsson %add = fadd double %A, %s1 52*c5d90e4bSJonas Paulsson %s2 = select i1 %tobool, double %A, double %add 53*c5d90e4bSJonas Paulsson ret double %s2 54*c5d90e4bSJonas Paulsson} 55*c5d90e4bSJonas Paulsson 56*c5d90e4bSJonas Paulsson; Two selects with different conditions can't be merged 57*c5d90e4bSJonas Paulssondefine double @test3(i32 signext %positive, double %A, double %B, double %C) { 58*c5d90e4bSJonas Paulssonentry: 59*c5d90e4bSJonas Paulsson; CHECK-LABEL: test3 60*c5d90e4bSJonas Paulsson; CHECK: cijl {{.*}}LBB3_2 61*c5d90e4bSJonas Paulsson; CHECK: cijl {{.*}}LBB3_4 62*c5d90e4bSJonas Paulsson; CHECK: br %r14 63*c5d90e4bSJonas Paulsson 64*c5d90e4bSJonas Paulsson %tobool = icmp slt i32 %positive, 0 65*c5d90e4bSJonas Paulsson %s1 = select i1 %tobool, double %A, double %B 66*c5d90e4bSJonas Paulsson %tobool2 = icmp slt i32 %positive, 2 67*c5d90e4bSJonas Paulsson %s2 = select i1 %tobool2, double %B, double %C 68*c5d90e4bSJonas Paulsson %add = fadd double %s1, %s2 69*c5d90e4bSJonas Paulsson ret double %add 70*c5d90e4bSJonas Paulsson} 71