[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / AggressiveInstCombine / trunc_select.ll
blobfd68978b7e8df62b89ad87dcbe545e1b93dc4d44
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -aggressive-instcombine -S | FileCheck %s
3 ; RUN: opt < %s -passes=aggressive-instcombine -S | FileCheck %s
5 target datalayout = "e-m:m-p1:64:64:64-p:32:32:32-n8:16:32"
7 define dso_local i16 @select_i16(i16 %a, i16 %b, i1 %cond) {
8 ; CHECK-LABEL: @select_i16(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]
11 ; CHECK-NEXT:    ret i16 [[SEL]]
13 entry:
14   %conv0 = sext i16 %a to i32
15   %conv1 = sext i16 %b to i32
16   %sel = select i1 %cond, i32 %conv0, i32 %conv1
17   %conv4 = trunc i32 %sel to i16
18   ret i16 %conv4
21 define dso_local i8 @select_i8(i8 %a, i8 %b, i1 %cond) {
22 ; CHECK-LABEL: @select_i8(
23 ; CHECK-NEXT:  entry:
24 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]
25 ; CHECK-NEXT:    ret i8 [[SEL]]
27 entry:
28   %conv0 = sext i8 %a to i32
29   %conv1 = sext i8 %b to i32
30   %sel = select i1 %cond, i32 %conv0, i32 %conv1
31   %conv4 = trunc i32 %sel to i8
32   ret i8 %conv4
35 define dso_local i16 @select_i8Ops_trunc_i16(i8 %a, i8 %b, i1 %cond) {
36 ; CHECK-LABEL: @select_i8Ops_trunc_i16(
37 ; CHECK-NEXT:  entry:
38 ; CHECK-NEXT:    [[CONV0:%.*]] = sext i8 [[A:%.*]] to i16
39 ; CHECK-NEXT:    [[CONV1:%.*]] = sext i8 [[B:%.*]] to i16
40 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i16 [[CONV0]], i16 [[CONV1]]
41 ; CHECK-NEXT:    ret i16 [[SEL]]
43 entry:
44   %conv0 = sext i8 %a to i32
45   %conv1 = sext i8 %b to i32
46   %sel = select i1 %cond, i32 %conv0, i32 %conv1
47   %conv4 = trunc i32 %sel to i16
48   ret i16 %conv4
52 define dso_local i16 @select_i16_const(i16 %a, i1 %cond) {
53 ; CHECK-LABEL: @select_i16_const(
54 ; CHECK-NEXT:  entry:
55 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i16 109, i16 [[A:%.*]]
56 ; CHECK-NEXT:    ret i16 [[SEL]]
58 entry:
59   %conv = sext i16 %a to i32
60   %sel = select i1 %cond, i32 109, i32 %conv
61   %conv4 = trunc i32 %sel to i16
62   ret i16 %conv4
65 ; 3080196 = 0x2f0004
66 define dso_local i16 @select_i16_bigConst(i16 %a, i1 %cond) {
67 ; CHECK-LABEL: @select_i16_bigConst(
68 ; CHECK-NEXT:  entry:
69 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i16 4, i16 [[A:%.*]]
70 ; CHECK-NEXT:    ret i16 [[SEL]]
72 entry:
73   %conv = sext i16 %a to i32
74   %sel = select i1 %cond, i32 3080196, i32 %conv
75   %conv4 = trunc i32 %sel to i16
76   ret i16 %conv4
79 define dso_local i8 @select_i8_const(i8 %a, i1 %cond) {
80 ; CHECK-LABEL: @select_i8_const(
81 ; CHECK-NEXT:  entry:
82 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i8 109, i8 [[A:%.*]]
83 ; CHECK-NEXT:    ret i8 [[SEL]]
85 entry:
86   %conv = sext i8 %a to i32
87   %sel = select i1 %cond, i32 109, i32 %conv
88   %conv4 = trunc i32 %sel to i8
89   ret i8 %conv4
92 ; 20228 = 0x4f02
93 define dso_local i8 @select_i8_bigConst(i8 %a, i1 %cond) {
94 ; CHECK-LABEL: @select_i8_bigConst(
95 ; CHECK-NEXT:  entry:
96 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i8 4, i8 [[A:%.*]]
97 ; CHECK-NEXT:    ret i8 [[SEL]]
99 entry:
100   %conv = sext i8 %a to i32
101   %sel = select i1 %cond, i32 20228, i32 %conv
102   %conv4 = trunc i32 %sel to i8
103   ret i8 %conv4
106 define dso_local i16 @select_sext(i8 %a, i1 %cond) {
107 ; CHECK-LABEL: @select_sext(
108 ; CHECK-NEXT:  entry:
109 ; CHECK-NEXT:    [[CONV:%.*]] = sext i8 [[A:%.*]] to i16
110 ; CHECK-NEXT:    [[SUB:%.*]] = sub i16 0, [[CONV]]
111 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i16 [[SUB]], i16 [[CONV]]
112 ; CHECK-NEXT:    ret i16 [[SEL]]
114 entry:
115   %conv = sext i8 %a to i32
116   %sub = sub nsw i32 0, %conv
117   %sel = select i1 %cond, i32 %sub, i32 %conv
118   %conv4 = trunc i32 %sel to i16
119   ret i16 %conv4
122 define dso_local i16 @select_zext(i8 %a, i1 %cond) {
123 ; CHECK-LABEL: @select_zext(
124 ; CHECK-NEXT:  entry:
125 ; CHECK-NEXT:    [[CONV:%.*]] = zext i8 [[A:%.*]] to i16
126 ; CHECK-NEXT:    [[SUB:%.*]] = sub i16 0, [[CONV]]
127 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[COND:%.*]], i16 [[SUB]], i16 [[CONV]]
128 ; CHECK-NEXT:    ret i16 [[SEL]]
130 entry:
131   %conv = zext i8 %a to i32
132   %sub = sub nsw i32 0, %conv
133   %sel = select i1 %cond, i32 %sub, i32 %conv
134   %conv4 = trunc i32 %sel to i16
135   ret i16 %conv4