135 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes='default<O1>' -S < %s | FileCheck %s3; RUN: opt -passes='default<O2>' -S < %s | FileCheck %s4; RUN: opt -passes="default<O3>" -S < %s | FileCheck %s5 6; We are worse at propagating correlation facts when in select form7; as compared to the PHI form, so if we lower switches to early,8; we may make further optimizations problematic.9 10; propagate value to bb2.11define i64 @test1(i64 %x) {12; CHECK-LABEL: @test1(13; CHECK-NEXT: entry:14; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i64 [[X:%.*]], 015; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 0, i64 1016; CHECK-NEXT: ret i64 [[SWITCH_SELECT]]17;18entry:19 switch i64 %x, label %bb3 [20 i64 0, label %bb121 i64 1, label %bb222 ]23bb1:24 ret i64 025bb2:26 %0 = icmp eq i64 %x, 10027 br i1 %0, label %bb4, label %bb528bb3:29 unreachable30bb4:31 ret i64 20032bb5:33 ret i64 1034}35 36; propagate value both to bb1 and bb2.37define i64 @test2(i64 %x) {38; CHECK-LABEL: @test2(39; CHECK-NEXT: entry:40; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i64 [[X:%.*]], 141; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 0, i64 1042; CHECK-NEXT: ret i64 [[SWITCH_SELECT]]43;44entry:45 switch i64 %x, label %bb3 [46 i64 1, label %bb147 i64 2, label %bb248 ]49bb1:50 %0 = icmp eq i64 %x, 10051 br i1 %0, label %bb4, label %return52return:53 ret i64 054bb2:55 %1 = icmp eq i64 %x, 10156 br i1 %1, label %bb4, label %bb557bb3:58 unreachable59bb4:60 ret i64 20061bb5:62 ret i64 1063}64 65define i64 @test3(i64 %x) {66; CHECK-LABEL: @test3(67; CHECK-NEXT: entry:68; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[X:%.*]], 169; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND]], i64 10, i64 070; CHECK-NEXT: ret i64 [[SPEC_SELECT]]71;72entry:73 switch i64 %x, label %bb1 [74 i64 1, label %bb275 ]76bb1:77 ret i64 078bb2:79 %0 = icmp eq i64 %x, 10080 br i1 %0, label %bb4, label %bb581bb4:82 ret i64 20083bb5:84 ret i64 1085}86 87; bb2 has two predecessors with case value 1 and 2.88define i64 @test_fail1(i64 %x) {89; CHECK-LABEL: @test_fail1(90; CHECK-NEXT: entry:91; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i64 [[X:%.*]], 092; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[SWITCH]], i64 0, i64 1093; CHECK-NEXT: ret i64 [[SPEC_SELECT]]94;95entry:96 switch i64 %x, label %bb3 [97 i64 0, label %bb198 i64 1, label %bb299 i64 2, label %bb2100 ]101bb1:102 ret i64 0103bb2:104 %0 = icmp eq i64 %x, 100105 br i1 %0, label %bb4, label %bb5106bb3:107 unreachable108bb4:109 ret i64 200110bb5:111 ret i64 10112}113 114; return block has two predecessors.115define i64 @test_fail2(i64 %x) {116; CHECK-LABEL: @test_fail2(117; CHECK-NEXT: entry:118; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i64 [[X:%.*]], 0119; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 2, i64 1120; CHECK-NEXT: ret i64 [[SWITCH_SELECT]]121;122entry:123 switch i64 %x, label %bb2 [124 i64 0, label %bb1125 i64 1, label %return126 ]127bb1:128 br label %return129return:130 %retval.0 = phi i64 [ %x, %entry ], [ 2, %bb1 ]131 ret i64 %retval.0132bb2:133 unreachable134}135