; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -passes=instcombine -S | FileCheck %s define i8 @fold_select_trunc_nuw_true(i8 %x, i8 %y) { ; CHECK-LABEL: @fold_select_trunc_nuw_true( ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[X:%.*]] to i1 ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 1, i8 [[Y:%.*]] ; CHECK-NEXT: ret i8 [[RET]] ; %trunc = trunc nuw i8 %x to i1 %ret = select i1 %trunc, i8 %x, i8 %y ret i8 %ret } define i8 @fold_select_trunc_nuw_false(i8 %x, i8 %y) { ; CHECK-LABEL: @fold_select_trunc_nuw_false( ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[X:%.*]] to i1 ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 [[Y:%.*]], i8 0 ; CHECK-NEXT: ret i8 [[RET]] ; %trunc = trunc nuw i8 %x to i1 %ret = select i1 %trunc, i8 %y, i8 %x ret i8 %ret } define i128 @fold_select_trunc_nsw_true(i128 %x, i128 %y) { ; CHECK-LABEL: @fold_select_trunc_nsw_true( ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nsw i128 [[X:%.*]] to i1 ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i128 -1, i128 [[Y:%.*]] ; CHECK-NEXT: ret i128 [[RET]] ; %trunc = trunc nsw i128 %x to i1 %ret = select i1 %trunc, i128 %x, i128 %y ret i128 %ret } define i8 @fold_select_trunc_nsw_false(i8 %x, i8 %y) { ; CHECK-LABEL: @fold_select_trunc_nsw_false( ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nsw i8 [[X:%.*]] to i1 ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 [[Y:%.*]], i8 0 ; CHECK-NEXT: ret i8 [[RET]] ; %trunc = trunc nsw i8 %x to i1 %ret = select i1 %trunc, i8 %y, i8 %x ret i8 %ret } define i8 @fold_select_trunc_negative(i8 %x, i8 %y) { ; CHECK-LABEL: @fold_select_trunc_negative( ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i1 ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TRUNC]], i8 [[X]], i8 [[Y:%.*]] ; CHECK-NEXT: ret i8 [[RET]] ; %trunc = trunc i8 %x to i1 %ret = select i1 %trunc, i8 %x, i8 %y ret i8 %ret } define <2 x i8> @fold_select_trunc_vector(<2 x i8> %x, <2 x i8> %y) { ; CHECK-LABEL: @fold_select_trunc_vector( ; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw <2 x i8> [[X:%.*]] to <2 x i1> ; CHECK-NEXT: [[RET:%.*]] = select <2 x i1> [[TRUNC]], <2 x i8> splat (i8 1), <2 x i8> [[Y:%.*]] ; CHECK-NEXT: ret <2 x i8> [[RET]] ; %trunc = trunc nuw <2 x i8> %x to <2 x i1> %ret = select <2 x i1> %trunc, <2 x i8> %x, <2 x i8> %y ret <2 x i8> %ret }