458 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @compare_unsigned_min(i8 %x, i8 %y) {5; CHECK-LABEL: define i1 @compare_unsigned_min(6; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {7; CHECK-NEXT: [[START:.*:]]8; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[X]], [[Y]]9; CHECK-NEXT: ret i1 [[TMP2]]10;11start:12 %cmp1 = icmp eq i8 %x, 013 %cmp2 = icmp ne i8 %y, 014 %cmp3 = icmp ult i8 %x, %y15 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp316 ret i1 %result17}18 19define i1 @compare_signed_min(i8 %x, i8 %y) {20; CHECK-LABEL: define i1 @compare_signed_min(21; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {22; CHECK-NEXT: [[START:.*:]]23; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]]24; CHECK-NEXT: ret i1 [[TMP4]]25;26start:27 %cmp1 = icmp eq i8 %x, -12828 %cmp2 = icmp ne i8 %y, -12829 %cmp3 = icmp slt i8 %x, %y30 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp331 ret i1 %result32}33 34define i1 @compare_unsigned_max(i8 %x, i8 %y) {35; CHECK-LABEL: define i1 @compare_unsigned_max(36; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {37; CHECK-NEXT: [[START:.*:]]38; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]]39; CHECK-NEXT: ret i1 [[TMP4]]40;41start:42 %cmp1 = icmp eq i8 %x, 25543 %cmp2 = icmp ne i8 %y, 25544 %cmp3 = icmp ugt i8 %x, %y45 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp346 ret i1 %result47}48 49define i1 @compare_signed_max(i8 %x, i8 %y) {50; CHECK-LABEL: define i1 @compare_signed_max(51; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {52; CHECK-NEXT: [[START:.*:]]53; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]]54; CHECK-NEXT: ret i1 [[TMP4]]55;56start:57 %cmp1 = icmp eq i8 %x, 12758 %cmp2 = icmp ne i8 %y, 12759 %cmp3 = icmp sgt i8 %x, %y60 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp361 ret i1 %result62}63 64define i1 @relational_cmp_unsigned_min(i8 %x, i8 %y) {65; CHECK-LABEL: define i1 @relational_cmp_unsigned_min(66; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {67; CHECK-NEXT: [[START:.*:]]68; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]]69; CHECK-NEXT: ret i1 [[TMP4]]70;71start:72 %cmp1 = icmp ule i8 %x, 073 %cmp2 = icmp ugt i8 %y, 074 %cmp3 = icmp ult i8 %x, %y75 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp376 ret i1 %result77}78 79define i1 @relational_cmp_signed_min(i8 %x, i8 %y) {80; CHECK-LABEL: define i1 @relational_cmp_signed_min(81; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {82; CHECK-NEXT: [[START:.*:]]83; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]]84; CHECK-NEXT: ret i1 [[TMP4]]85;86start:87 %cmp1 = icmp sle i8 %x, -12888 %cmp2 = icmp sgt i8 %y, -12889 %cmp3 = icmp slt i8 %x, %y90 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp391 ret i1 %result92}93 94define i1 @relational_cmp_unsigned_max(i8 %x, i8 %y) {95; CHECK-LABEL: define i1 @relational_cmp_unsigned_max(96; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {97; CHECK-NEXT: [[START:.*:]]98; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]]99; CHECK-NEXT: ret i1 [[TMP4]]100;101start:102 %cmp1 = icmp uge i8 %x, 255103 %cmp2 = icmp ult i8 %y, 255104 %cmp3 = icmp ugt i8 %x, %y105 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3106 ret i1 %result107}108 109define i1 @relational_cmp_signed_max(i8 %x, i8 %y) {110; CHECK-LABEL: define i1 @relational_cmp_signed_max(111; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {112; CHECK-NEXT: [[START:.*:]]113; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]]114; CHECK-NEXT: ret i1 [[TMP4]]115;116start:117 %cmp1 = icmp sge i8 %x, 127118 %cmp2 = icmp slt i8 %y, 127119 %cmp3 = icmp sgt i8 %x, %y120 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3121 ret i1 %result122}123 124declare void @use(i1)125 126define i1 @compare_signed_max_multiuse(i8 %x, i8 %y) {127; CHECK-LABEL: define i1 @compare_signed_max_multiuse(128; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {129; CHECK-NEXT: [[START:.*:]]130; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]]131; CHECK-NEXT: call void @use(i1 [[TMP4]])132; CHECK-NEXT: [[RESULT:%.*]] = icmp sgt i8 [[X]], [[Y]]133; CHECK-NEXT: ret i1 [[RESULT]]134;135start:136 %cmp1 = icmp eq i8 %x, 127137 %cmp2 = icmp ne i8 %y, 127138 %cmp3 = icmp sgt i8 %x, %y139 call void @use(i1 %cmp3)140 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3141 ret i1 %result142}143 144define i1 @compare_signed_min_samesign(i8 %x, i8 %y) {145; CHECK-LABEL: define i1 @compare_signed_min_samesign(146; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {147; CHECK-NEXT: [[START:.*:]]148; CHECK-NEXT: [[RESULT:%.*]] = icmp slt i8 [[X]], [[Y]]149; CHECK-NEXT: ret i1 [[RESULT]]150;151start:152 %cmp1 = icmp eq i8 %x, -128153 %cmp2 = icmp ne i8 %y, -128154 %cmp3 = icmp samesign slt i8 %x, %y155 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3156 ret i1 %result157}158 159define i1 @compare_flipped(i8 %x, i8 %y) {160; CHECK-LABEL: define i1 @compare_flipped(161; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {162; CHECK-NEXT: [[START:.*:]]163; CHECK-NEXT: [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]]164; CHECK-NEXT: ret i1 [[RESULT]]165;166start:167 %cmp1 = icmp eq i8 %x, 0168 %cmp2 = icmp ne i8 %y, 0169 %cmp3 = icmp ugt i8 %y, %x170 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3171 ret i1 %result172}173 174define i1 @compare_swapped(i8 %x, i8 %y) {175; CHECK-LABEL: define i1 @compare_swapped(176; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {177; CHECK-NEXT: [[START:.*:]]178; CHECK-NEXT: [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]]179; CHECK-NEXT: ret i1 [[RESULT]]180;181start:182 %cmp1 = icmp ne i8 %x, 0183 %cmp2 = icmp ne i8 %y, 0184 %cmp3 = icmp ult i8 %x, %y185 %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2186 ret i1 %result187}188 189define i1 @compare_swapped_flipped_unsigned_max(i8 %x, i8 %y) {190; CHECK-LABEL: define i1 @compare_swapped_flipped_unsigned_max(191; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {192; CHECK-NEXT: [[START:.*:]]193; CHECK-NEXT: [[RESULT:%.*]] = icmp ugt i8 [[X]], [[Y]]194; CHECK-NEXT: ret i1 [[RESULT]]195;196start:197 %cmp1 = icmp ne i8 %x, 255198 %cmp2 = icmp ne i8 %y, 255199 %cmp3 = icmp ult i8 %y, %x200 %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2201 ret i1 %result202}203 204define i1 @compare_unsigned_min_illegal_type(i9 %x, i9 %y) {205; CHECK-LABEL: define i1 @compare_unsigned_min_illegal_type(206; CHECK-SAME: i9 [[X:%.*]], i9 [[Y:%.*]]) {207; CHECK-NEXT: [[START:.*:]]208; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i9 [[X]], [[Y]]209; CHECK-NEXT: ret i1 [[TMP2]]210;211start:212 %cmp1 = icmp eq i9 %x, 0213 %cmp2 = icmp ne i9 %y, 0214 %cmp3 = icmp ult i9 %x, %y215 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3216 ret i1 %result217}218 219define i1 @compare_true_poison(i8 %x, i8 %y) {220; CHECK-LABEL: define i1 @compare_true_poison(221; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {222; CHECK-NEXT: [[START:.*:]]223; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]224; CHECK-NEXT: ret i1 [[CMP3]]225;226start:227 %cmp1 = icmp eq i8 %x, 0228 %cmp2 = icmp ne i8 %y, 0229 %cmp3 = icmp ult i8 %x, %y230 %result = select i1 %cmp1, i1 poison, i1 %cmp3231 ret i1 %result232}233 234define <2 x i1> @compare_vector(<2 x i8> %x, <2 x i8> %y) {235; CHECK-LABEL: define <2 x i1> @compare_vector(236; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) {237; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <2 x i8> [[X]], [[Y]]238; CHECK-NEXT: ret <2 x i1> [[TMP1]]239;240 %cmp1 = icmp eq <2 x i8> %x, zeroinitializer241 %cmp2 = icmp ne <2 x i8> %y, zeroinitializer242 %cmp3 = icmp ult <2 x i8> %x, %y243 %result = select <2 x i1> %cmp1, <2 x i1> %cmp2, <2 x i1> %cmp3244 ret <2 x i1> %result245}246 247define i1 @compare_pointer_negative(ptr %x, ptr %y) {248; CHECK-LABEL: define i1 @compare_pointer_negative(249; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) {250; CHECK-NEXT: [[START:.*:]]251; CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[X]], inttoptr (i8 127 to ptr)252; CHECK-NEXT: [[TMP3:%.*]] = icmp ne ptr [[Y]], inttoptr (i8 127 to ptr)253; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt ptr [[X]], [[Y]]254; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]255; CHECK-NEXT: ret i1 [[RESULT]]256;257start:258 %X = inttoptr i8 127 to ptr259 %cmp1 = icmp eq ptr %x, %X260 %cmp2 = icmp ne ptr %y, %X261 %cmp3 = icmp sgt ptr %x, %y262 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3263 ret i1 %result264}265 266define i1 @compare_float_negative(half %x, half %y) {267; CHECK-LABEL: define i1 @compare_float_negative(268; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]]) {269; CHECK-NEXT: [[START:.*:]]270; CHECK-NEXT: [[TMP2:%.*]] = fcmp oeq half [[X]], 0xH0000271; CHECK-NEXT: [[TMP3:%.*]] = fcmp one half [[Y]], 0xH0000272; CHECK-NEXT: [[TMP4:%.*]] = fcmp ult half [[X]], [[Y]]273; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]274; CHECK-NEXT: ret i1 [[RESULT]]275;276start:277 %cmp1 = fcmp oeq half %x, 0.0278 %cmp2 = fcmp one half %y, 0.0279 %cmp3 = fcmp ult half %x, %y280 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3281 ret i1 %result282}283 284define i1 @compare_unsigned_max_swapped_lhs_rhs_negative(i8 %x, i8 %y) {285; CHECK-LABEL: define i1 @compare_unsigned_max_swapped_lhs_rhs_negative(286; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {287; CHECK-NEXT: [[START:.*:]]288; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -1289; CHECK-NEXT: [[DOTNOT:%.*]] = icmp ne i8 [[Y]], -1290; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[DOTNOT]], i1 [[TMP2]], i1 false291; CHECK-NEXT: ret i1 [[RESULT]]292;293start:294 %cmp1 = icmp eq i8 %x, 255295 %cmp2 = icmp ne i8 %y, 255296 %cmp3 = icmp ugt i8 %x, %y297 %result = select i1 %cmp2, i1 %cmp1, i1 %cmp3298 ret i1 %result299}300 301define i1 @compare_signed_min_negative(i8 %x, i8 %y) {302; CHECK-LABEL: define i1 @compare_signed_min_negative(303; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {304; CHECK-NEXT: [[START:.*:]]305; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -127306; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], -127307; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]]308; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]309; CHECK-NEXT: ret i1 [[RESULT]]310;311start:312 %cmp1 = icmp eq i8 %x, -127313 %cmp2 = icmp ne i8 %y, -127314 %cmp3 = icmp slt i8 %x, %y315 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3316 ret i1 %result317}318 319define i1 @compare_unsigned_max_negative(i8 %x, i8 %y) {320; CHECK-LABEL: define i1 @compare_unsigned_max_negative(321; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {322; CHECK-NEXT: [[START:.*:]]323; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -1324; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], -1325; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]]326; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]327; CHECK-NEXT: ret i1 [[RESULT]]328;329start:330 %cmp1 = icmp eq i8 %x, 255331 %cmp2 = icmp ne i8 %y, 255332 %cmp3 = icmp ult i8 %x, %y333 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3334 ret i1 %result335}336 337define i1 @non_strict_op_negative(i8 %x, i8 %y) {338; CHECK-LABEL: define i1 @non_strict_op_negative(339; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {340; CHECK-NEXT: [[START:.*:]]341; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], 0342; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], 0343; CHECK-NEXT: [[TMP4:%.*]] = icmp ule i8 [[X]], [[Y]]344; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]]345; CHECK-NEXT: ret i1 [[RESULT]]346;347start:348 %cmp1 = icmp eq i8 %x, 0349 %cmp2 = icmp ne i8 %y, 0350 %cmp3 = icmp ule i8 %x, %y351 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3352 ret i1 %result353}354 355define i1 @compare_poison_negative(i8 %x, i8 %y) {356; CHECK-LABEL: define i1 @compare_poison_negative(357; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {358; CHECK-NEXT: [[START:.*:]]359; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0360; CHECK-NEXT: ret i1 [[CMP2]]361;362start:363 %cmp1 = icmp eq i8 %x, 0364 %cmp2 = icmp ne i8 %y, 0365 %result = select i1 %cmp1, i1 %cmp2, i1 poison366 ret i1 %result367}368 369define i1 @mismatched_cond_lhs_negative(i8 %x, i8 %y, i8 %z) {370; CHECK-LABEL: define i1 @mismatched_cond_lhs_negative(371; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) {372; CHECK-NEXT: [[START:.*:]]373; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0374; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0375; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[Z]], [[Y]]376; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]377; CHECK-NEXT: ret i1 [[RESULT]]378;379start:380 %cmp1 = icmp eq i8 %x, 0381 %cmp2 = icmp ne i8 %y, 0382 %cmp3 = icmp ult i8 %z, %y383 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3384 ret i1 %result385}386 387define i1 @mismatched_trueval_lhs_negative(i8 %x, i8 %y, i8 %z) {388; CHECK-LABEL: define i1 @mismatched_trueval_lhs_negative(389; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) {390; CHECK-NEXT: [[START:.*:]]391; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0392; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0393; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Z]]394; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]395; CHECK-NEXT: ret i1 [[RESULT]]396;397start:398 %cmp1 = icmp eq i8 %x, 0399 %cmp2 = icmp ne i8 %y, 0400 %cmp3 = icmp ult i8 %x, %z401 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3402 ret i1 %result403}404 405define i1 @mismatched_constant_negative(i8 %x, i8 %y) {406; CHECK-LABEL: define i1 @mismatched_constant_negative(407; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {408; CHECK-NEXT: [[START:.*:]]409; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0410; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 2411; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]412; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]413; CHECK-NEXT: ret i1 [[RESULT]]414;415start:416 %cmp1 = icmp eq i8 %x, 0417 %cmp2 = icmp ne i8 %y, 2418 %cmp3 = icmp ult i8 %x, %y419 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3420 ret i1 %result421}422 423define i1 @mismatched_constant_two_negative(i8 %x, i8 %y) {424; CHECK-LABEL: define i1 @mismatched_constant_two_negative(425; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {426; CHECK-NEXT: [[START:.*:]]427; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 2428; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0429; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]430; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]431; CHECK-NEXT: ret i1 [[RESULT]]432;433start:434 %cmp1 = icmp eq i8 %x, 2435 %cmp2 = icmp ne i8 %y, 0436 %cmp3 = icmp ult i8 %x, %y437 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3438 ret i1 %result439}440 441define i1 @compare_eq_eq_negative(i8 %x, i8 %y) {442; CHECK-LABEL: define i1 @compare_eq_eq_negative(443; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) {444; CHECK-NEXT: [[START:.*:]]445; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0446; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[Y]], 0447; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]]448; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]]449; CHECK-NEXT: ret i1 [[RESULT]]450;451start:452 %cmp1 = icmp eq i8 %x, 0453 %cmp2 = icmp eq i8 %y, 0454 %cmp3 = icmp ult i8 %x, %y455 %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3456 ret i1 %result457}458