| ; 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() |