xref: /llvm-project/llvm/test/Transforms/InstCombine/switch-zext-sext.ll (revision 7c3bcc307a8fa9153a171f6abb4e8fdc91bd6030)
1*7c3bcc30SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*7c3bcc30SYingwei Zheng; RUN: opt %s -passes=instcombine -S | FileCheck %s
3*7c3bcc30SYingwei Zheng
4*7c3bcc30SYingwei Zhengdefine i1 @test_switch_with_zext(i16 %a, i1 %b, i1 %c) {
5*7c3bcc30SYingwei Zheng; CHECK-LABEL: define i1 @test_switch_with_zext(
6*7c3bcc30SYingwei Zheng; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {
7*7c3bcc30SYingwei Zheng; CHECK-NEXT:  entry:
8*7c3bcc30SYingwei Zheng; CHECK-NEXT:    switch i16 [[A]], label [[SW_DEFAULT:%.*]] [
9*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i16 37, label [[SW_BB:%.*]]
10*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i16 38, label [[SW_BB]]
11*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i16 39, label [[SW_BB]]
12*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ]
13*7c3bcc30SYingwei Zheng; CHECK:       sw.bb:
14*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[B]]
15*7c3bcc30SYingwei Zheng; CHECK:       sw.default:
16*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[C]]
17*7c3bcc30SYingwei Zheng;
18*7c3bcc30SYingwei Zhengentry:
19*7c3bcc30SYingwei Zheng  %a.ext = zext i16 %a to i32
20*7c3bcc30SYingwei Zheng  switch i32 %a.ext, label %sw.default [
21*7c3bcc30SYingwei Zheng  i32 37, label %sw.bb
22*7c3bcc30SYingwei Zheng  i32 38, label %sw.bb
23*7c3bcc30SYingwei Zheng  i32 39, label %sw.bb
24*7c3bcc30SYingwei Zheng  ]
25*7c3bcc30SYingwei Zheng
26*7c3bcc30SYingwei Zhengsw.bb:
27*7c3bcc30SYingwei Zheng  ret i1 %b
28*7c3bcc30SYingwei Zhengsw.default:
29*7c3bcc30SYingwei Zheng  ret i1 %c
30*7c3bcc30SYingwei Zheng}
31*7c3bcc30SYingwei Zheng
32*7c3bcc30SYingwei Zhengdefine i1 @test_switch_with_sext(i16 %a, i1 %b, i1 %c) {
33*7c3bcc30SYingwei Zheng; CHECK-LABEL: define i1 @test_switch_with_sext(
34*7c3bcc30SYingwei Zheng; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {
35*7c3bcc30SYingwei Zheng; CHECK-NEXT:  entry:
36*7c3bcc30SYingwei Zheng; CHECK-NEXT:    switch i16 [[A]], label [[SW_DEFAULT:%.*]] [
37*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i16 37, label [[SW_BB:%.*]]
38*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i16 38, label [[SW_BB]]
39*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i16 39, label [[SW_BB]]
40*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ]
41*7c3bcc30SYingwei Zheng; CHECK:       sw.bb:
42*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[B]]
43*7c3bcc30SYingwei Zheng; CHECK:       sw.default:
44*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[C]]
45*7c3bcc30SYingwei Zheng;
46*7c3bcc30SYingwei Zhengentry:
47*7c3bcc30SYingwei Zheng  %a.ext = sext i16 %a to i32
48*7c3bcc30SYingwei Zheng  switch i32 %a.ext, label %sw.default [
49*7c3bcc30SYingwei Zheng  i32 37, label %sw.bb
50*7c3bcc30SYingwei Zheng  i32 38, label %sw.bb
51*7c3bcc30SYingwei Zheng  i32 39, label %sw.bb
52*7c3bcc30SYingwei Zheng  ]
53*7c3bcc30SYingwei Zheng
54*7c3bcc30SYingwei Zhengsw.bb:
55*7c3bcc30SYingwei Zheng  ret i1 %b
56*7c3bcc30SYingwei Zhengsw.default:
57*7c3bcc30SYingwei Zheng  ret i1 %c
58*7c3bcc30SYingwei Zheng}
59*7c3bcc30SYingwei Zheng
60*7c3bcc30SYingwei Zheng; Negative tests
61*7c3bcc30SYingwei Zheng
62*7c3bcc30SYingwei Zhengdefine i1 @test_switch_with_zext_unreachable_case(i16 %a, i1 %b, i1 %c) {
63*7c3bcc30SYingwei Zheng; CHECK-LABEL: define i1 @test_switch_with_zext_unreachable_case(
64*7c3bcc30SYingwei Zheng; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {
65*7c3bcc30SYingwei Zheng; CHECK-NEXT:  entry:
66*7c3bcc30SYingwei Zheng; CHECK-NEXT:    [[A_EXT:%.*]] = zext i16 [[A]] to i32
67*7c3bcc30SYingwei Zheng; CHECK-NEXT:    switch i32 [[A_EXT]], label [[SW_DEFAULT:%.*]] [
68*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 37, label [[SW_BB:%.*]]
69*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 38, label [[SW_BB]]
70*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 39, label [[SW_BB]]
71*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 65537, label [[SW_BB]]
72*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ]
73*7c3bcc30SYingwei Zheng; CHECK:       sw.bb:
74*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[B]]
75*7c3bcc30SYingwei Zheng; CHECK:       sw.default:
76*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[C]]
77*7c3bcc30SYingwei Zheng;
78*7c3bcc30SYingwei Zhengentry:
79*7c3bcc30SYingwei Zheng  %a.ext = zext i16 %a to i32
80*7c3bcc30SYingwei Zheng  switch i32 %a.ext, label %sw.default [
81*7c3bcc30SYingwei Zheng  i32 37, label %sw.bb
82*7c3bcc30SYingwei Zheng  i32 38, label %sw.bb
83*7c3bcc30SYingwei Zheng  i32 39, label %sw.bb
84*7c3bcc30SYingwei Zheng  i32 65537, label %sw.bb
85*7c3bcc30SYingwei Zheng  ]
86*7c3bcc30SYingwei Zheng
87*7c3bcc30SYingwei Zhengsw.bb:
88*7c3bcc30SYingwei Zheng  ret i1 %b
89*7c3bcc30SYingwei Zhengsw.default:
90*7c3bcc30SYingwei Zheng  ret i1 %c
91*7c3bcc30SYingwei Zheng}
92*7c3bcc30SYingwei Zheng
93*7c3bcc30SYingwei Zhengdefine i1 @test_switch_with_sext_unreachable_case(i16 %a, i1 %b, i1 %c) {
94*7c3bcc30SYingwei Zheng; CHECK-LABEL: define i1 @test_switch_with_sext_unreachable_case(
95*7c3bcc30SYingwei Zheng; CHECK-SAME: i16 [[A:%.*]], i1 [[B:%.*]], i1 [[C:%.*]]) {
96*7c3bcc30SYingwei Zheng; CHECK-NEXT:  entry:
97*7c3bcc30SYingwei Zheng; CHECK-NEXT:    [[A_EXT:%.*]] = sext i16 [[A]] to i32
98*7c3bcc30SYingwei Zheng; CHECK-NEXT:    switch i32 [[A_EXT]], label [[SW_DEFAULT:%.*]] [
99*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 37, label [[SW_BB:%.*]]
100*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 38, label [[SW_BB]]
101*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 39, label [[SW_BB]]
102*7c3bcc30SYingwei Zheng; CHECK-NEXT:      i32 -65537, label [[SW_BB]]
103*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ]
104*7c3bcc30SYingwei Zheng; CHECK:       sw.bb:
105*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[B]]
106*7c3bcc30SYingwei Zheng; CHECK:       sw.default:
107*7c3bcc30SYingwei Zheng; CHECK-NEXT:    ret i1 [[C]]
108*7c3bcc30SYingwei Zheng;
109*7c3bcc30SYingwei Zhengentry:
110*7c3bcc30SYingwei Zheng  %a.ext = sext i16 %a to i32
111*7c3bcc30SYingwei Zheng  switch i32 %a.ext, label %sw.default [
112*7c3bcc30SYingwei Zheng  i32 37, label %sw.bb
113*7c3bcc30SYingwei Zheng  i32 38, label %sw.bb
114*7c3bcc30SYingwei Zheng  i32 39, label %sw.bb
115*7c3bcc30SYingwei Zheng  i32 -65537, label %sw.bb
116*7c3bcc30SYingwei Zheng  ]
117*7c3bcc30SYingwei Zheng
118*7c3bcc30SYingwei Zhengsw.bb:
119*7c3bcc30SYingwei Zheng  ret i1 %b
120*7c3bcc30SYingwei Zhengsw.default:
121*7c3bcc30SYingwei Zheng  ret i1 %c
122*7c3bcc30SYingwei Zheng}
123