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