| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 | |
| ; RUN: opt < %s -passes=instcombine -S | FileCheck %s | |
| define void @test_ult_rhsc(i8 %x) { | |
| ; CHECK-LABEL: define void @test_ult_rhsc( | |
| ; CHECK-SAME: i8 [[X:%.*]]) { | |
| ; CHECK-NEXT: switch i8 [[X]], label [[BB1:%.*]] [ | |
| ; CHECK-NEXT: i8 2, label [[BB2:%.*]] | |
| ; CHECK-NEXT: i8 12, label [[BB3:%.*]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb1: | |
| ; CHECK-NEXT: call void @func1() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb2: | |
| ; CHECK-NEXT: call void @func2() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb3: | |
| ; CHECK-NEXT: call void @func3() | |
| ; CHECK-NEXT: unreachable | |
| ; | |
| %val = add nsw i8 %x, -2 | |
| %cmp = icmp ult i8 %val, 11 | |
| %cond = select i1 %cmp, i8 %val, i8 6 | |
| switch i8 %cond, label %bb1 [ | |
| i8 0, label %bb2 | |
| i8 10, label %bb3 | |
| ] | |
| bb1: | |
| call void @func1() | |
| unreachable | |
| bb2: | |
| call void @func2() | |
| unreachable | |
| bb3: | |
| call void @func3() | |
| unreachable | |
| } | |
| define void @test_eq_lhsc(i8 %x) { | |
| ; CHECK-LABEL: define void @test_eq_lhsc( | |
| ; CHECK-SAME: i8 [[X:%.*]]) { | |
| ; CHECK-NEXT: switch i8 [[X]], label [[BB1:%.*]] [ | |
| ; CHECK-NEXT: i8 0, label [[BB2:%.*]] | |
| ; CHECK-NEXT: i8 10, label [[BB3:%.*]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb1: | |
| ; CHECK-NEXT: call void @func1() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb2: | |
| ; CHECK-NEXT: call void @func2() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb3: | |
| ; CHECK-NEXT: call void @func3() | |
| ; CHECK-NEXT: unreachable | |
| ; | |
| %cmp = icmp eq i8 %x, 4 | |
| %cond = select i1 %cmp, i8 6, i8 %x | |
| switch i8 %cond, label %bb1 [ | |
| i8 0, label %bb2 | |
| i8 10, label %bb3 | |
| ] | |
| bb1: | |
| call void @func1() | |
| unreachable | |
| bb2: | |
| call void @func2() | |
| unreachable | |
| bb3: | |
| call void @func3() | |
| unreachable | |
| } | |
| define void @test_ult_rhsc_invalid_cond(i8 %x, i8 %y) { | |
| ; CHECK-LABEL: define void @test_ult_rhsc_invalid_cond( | |
| ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { | |
| ; CHECK-NEXT: [[VAL:%.*]] = add nsw i8 [[X]], -2 | |
| ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[Y]], 11 | |
| ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 6 | |
| ; CHECK-NEXT: switch i8 [[COND]], label [[BB1:%.*]] [ | |
| ; CHECK-NEXT: i8 0, label [[BB2:%.*]] | |
| ; CHECK-NEXT: i8 10, label [[BB3:%.*]] | |
| ; CHECK-NEXT: i8 13, label [[BB3]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb1: | |
| ; CHECK-NEXT: call void @func1() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb2: | |
| ; CHECK-NEXT: call void @func2() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb3: | |
| ; CHECK-NEXT: call void @func3() | |
| ; CHECK-NEXT: unreachable | |
| ; | |
| %val = add nsw i8 %x, -2 | |
| %cmp = icmp ult i8 %y, 11 | |
| %cond = select i1 %cmp, i8 %val, i8 6 | |
| switch i8 %cond, label %bb1 [ | |
| i8 0, label %bb2 | |
| i8 10, label %bb3 | |
| i8 13, label %bb3 | |
| ] | |
| bb1: | |
| call void @func1() | |
| unreachable | |
| bb2: | |
| call void @func2() | |
| unreachable | |
| bb3: | |
| call void @func3() | |
| unreachable | |
| } | |
| define void @test_ult_rhsc_fail(i8 %x) { | |
| ; CHECK-LABEL: define void @test_ult_rhsc_fail( | |
| ; CHECK-SAME: i8 [[X:%.*]]) { | |
| ; CHECK-NEXT: [[VAL:%.*]] = add nsw i8 [[X]], -2 | |
| ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[VAL]], 11 | |
| ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i8 [[VAL]], i8 6 | |
| ; CHECK-NEXT: switch i8 [[COND]], label [[BB1:%.*]] [ | |
| ; CHECK-NEXT: i8 0, label [[BB2:%.*]] | |
| ; CHECK-NEXT: i8 10, label [[BB3:%.*]] | |
| ; CHECK-NEXT: i8 13, label [[BB3]] | |
| ; CHECK-NEXT: ] | |
| ; CHECK: bb1: | |
| ; CHECK-NEXT: call void @func1() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb2: | |
| ; CHECK-NEXT: call void @func2() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: bb3: | |
| ; CHECK-NEXT: call void @func3() | |
| ; CHECK-NEXT: unreachable | |
| ; | |
| %val = add nsw i8 %x, -2 | |
| %cmp = icmp ult i8 %val, 11 | |
| %cond = select i1 %cmp, i8 %val, i8 6 | |
| switch i8 %cond, label %bb1 [ | |
| i8 0, label %bb2 | |
| i8 10, label %bb3 | |
| i8 13, label %bb3 | |
| ] | |
| bb1: | |
| call void @func1() | |
| unreachable | |
| bb2: | |
| call void @func2() | |
| unreachable | |
| bb3: | |
| call void @func3() | |
| unreachable | |
| } | |
| declare void @func1() | |
| declare void @func2() | |
| declare void @func3() |