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(
10 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i16 [[A:%.*]], i16 [[B:%.*]]
11 ; CHECK-NEXT: ret i16 [[SEL]]
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
21 define dso_local i8 @select_i8(i8 %a, i8 %b, i1 %cond) {
22 ; CHECK-LABEL: @select_i8(
24 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i8 [[A:%.*]], i8 [[B:%.*]]
25 ; CHECK-NEXT: ret i8 [[SEL]]
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
35 define dso_local i16 @select_i8Ops_trunc_i16(i8 %a, i8 %b, i1 %cond) {
36 ; CHECK-LABEL: @select_i8Ops_trunc_i16(
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]]
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
52 define dso_local i16 @select_i16_const(i16 %a, i1 %cond) {
53 ; CHECK-LABEL: @select_i16_const(
55 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i16 109, i16 [[A:%.*]]
56 ; CHECK-NEXT: ret i16 [[SEL]]
59 %conv = sext i16 %a to i32
60 %sel = select i1 %cond, i32 109, i32 %conv
61 %conv4 = trunc i32 %sel to i16
66 define dso_local i16 @select_i16_bigConst(i16 %a, i1 %cond) {
67 ; CHECK-LABEL: @select_i16_bigConst(
69 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i16 4, i16 [[A:%.*]]
70 ; CHECK-NEXT: ret i16 [[SEL]]
73 %conv = sext i16 %a to i32
74 %sel = select i1 %cond, i32 3080196, i32 %conv
75 %conv4 = trunc i32 %sel to i16
79 define dso_local i8 @select_i8_const(i8 %a, i1 %cond) {
80 ; CHECK-LABEL: @select_i8_const(
82 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i8 109, i8 [[A:%.*]]
83 ; CHECK-NEXT: ret i8 [[SEL]]
86 %conv = sext i8 %a to i32
87 %sel = select i1 %cond, i32 109, i32 %conv
88 %conv4 = trunc i32 %sel to i8
93 define dso_local i8 @select_i8_bigConst(i8 %a, i1 %cond) {
94 ; CHECK-LABEL: @select_i8_bigConst(
96 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], i8 4, i8 [[A:%.*]]
97 ; CHECK-NEXT: ret i8 [[SEL]]
100 %conv = sext i8 %a to i32
101 %sel = select i1 %cond, i32 20228, i32 %conv
102 %conv4 = trunc i32 %sel to i8
106 define dso_local i16 @select_sext(i8 %a, i1 %cond) {
107 ; CHECK-LABEL: @select_sext(
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]]
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
122 define dso_local i16 @select_zext(i8 %a, i1 %cond) {
123 ; CHECK-LABEL: @select_zext(
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]]
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