[OpenACC] Implement 'collapse' for combined constructs.
[llvm-project.git] / llvm / test / Transforms / CodeGenPrepare / X86 / widen_switch.ll
blob9d04c4be49f4bfcf13c4d22008a5c027d4f2dae7
1 ;; x86 is chosen to show the transform when 8-bit and 16-bit registers are available.
3 ; RUN: opt < %s -codegenprepare -S -mtriple=x86_64-unknown-unknown    | FileCheck %s --check-prefix=X86
4 ; RUN: opt < %s -debugify -codegenprepare -S -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=DEBUG
6 ; X86 prefers i32 over i16 for address calculation.
8 define i32 @widen_switch_i16(i32 %a)  {
9 entry:
10   %trunc = trunc i32 %a to i16
11   switch i16 %trunc, label %sw.default [
12     i16 1, label %sw.bb0
13     i16 -1, label %sw.bb1
14   ]
16 sw.bb0:
17   br label %return
19 sw.bb1:
20   br label %return
22 sw.default:
23   br label %return
25 return:
26   %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
27   ret i32 %retval
29 ; X86-LABEL: @widen_switch_i16(
30 ; X86:       %trunc = trunc i32 %a to i16
31 ; X86-NEXT:  %0 = zext i16 %trunc to i32
32 ; X86-NEXT:  switch i32 %0, label %sw.default [
33 ; X86-NEXT:    i32 1, label %sw.bb0
34 ; X86-NEXT:    i32 65535, label %sw.bb1
37 ; Widen to 32-bit from a smaller, non-native type.
39 define i32 @widen_switch_i17(i32 %a)  {
40 entry:
41   %trunc = trunc i32 %a to i17
42   switch i17 %trunc, label %sw.default [
43     i17 10, label %sw.bb0
44     i17 -1, label %sw.bb1
45   ]
47 sw.bb0:
48   br label %return
50 sw.bb1:
51   br label %return
53 sw.default:
54   br label %return
56 return:
57   %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
58   ret i32 %retval
60 ; X86-LABEL: @widen_switch_i17(
61 ; X86:       %0 = zext i17 %trunc to i32
62 ; X86-NEXT:  switch i32 %0, label %sw.default [
63 ; X86-NEXT:    i32 10, label %sw.bb0
64 ; X86-NEXT:    i32 131071, label %sw.bb1
66 ; DEBUG-LABEL: @widen_switch_i17(
67 ; DEBUG:       zext i17 %trunc to i32, !dbg [[switch_loc:![0-9]+]]
68 ; DEBUG-NEXT:  switch i32 {{.*}} [
69 ; DEBUG-NEXT:    label %sw.bb0
70 ; DEBUG-NEXT:    label %sw.bb1
71 ; DEBUG-NEXT:  ], !dbg [[switch_loc]]
74 ; If the switch condition is a sign-extended function argument, then the
75 ; condition and cases should be sign-extended rather than zero-extended
76 ; because the sign-extension can be optimized away.
78 define i32 @widen_switch_i16_sext(i2 signext %a)  {
79 entry:
80   switch i2 %a, label %sw.default [
81     i2 1, label %sw.bb0
82     i2 -1, label %sw.bb1
83   ]
85 sw.bb0:
86   br label %return
88 sw.bb1:
89   br label %return
91 sw.default:
92   br label %return
94 return:
95   %retval = phi i32 [ -1, %sw.default ], [ 0, %sw.bb0 ], [ 1, %sw.bb1 ]
96   ret i32 %retval
98 ; X86-LABEL: @widen_switch_i16_sext(
99 ; X86:       %0 = sext i2 %a to i32
100 ; X86-NEXT:  switch i32 %0, label %sw.default [
101 ; X86-NEXT:    i32 1, label %sw.bb0
102 ; X86-NEXT:    i32 -1, label %sw.bb1