309 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; shift left5 6define i32 @and_signbit_select_shl(i32 %x, i1 %cond) {7; CHECK-LABEL: @and_signbit_select_shl(8; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 89; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], -1677721610; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]11; CHECK-NEXT: ret i32 [[R]]12;13 %t0 = and i32 %x, 4294901760 ; 0xFFFF000014 %t1 = select i1 %cond, i32 %t0, i32 %x15 %r = shl i32 %t1, 816 ret i32 %r17}18define i32 @and_nosignbit_select_shl(i32 %x, i1 %cond) {19; CHECK-LABEL: @and_nosignbit_select_shl(20; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 821; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], -1677721622; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]23; CHECK-NEXT: ret i32 [[R]]24;25 %t0 = and i32 %x, 2147418112 ; 0x7FFF000026 %t1 = select i1 %cond, i32 %t0, i32 %x27 %r = shl i32 %t1, 828 ret i32 %r29}30 31define i32 @or_signbit_select_shl(i32 %x, i1 %cond) {32; CHECK-LABEL: @or_signbit_select_shl(33; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 834; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], -1677721635; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]36; CHECK-NEXT: ret i32 [[R]]37;38 %t0 = or i32 %x, 4294901760 ; 0xFFFF000039 %t1 = select i1 %cond, i32 %t0, i32 %x40 %r = shl i32 %t1, 841 ret i32 %r42}43define i32 @or_nosignbit_select_shl(i32 %x, i1 %cond) {44; CHECK-LABEL: @or_nosignbit_select_shl(45; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 846; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], -1677721647; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]48; CHECK-NEXT: ret i32 [[R]]49;50 %t0 = or i32 %x, 2147418112 ; 0x7FFF000051 %t1 = select i1 %cond, i32 %t0, i32 %x52 %r = shl i32 %t1, 853 ret i32 %r54}55 56define i32 @xor_signbit_select_shl(i32 %x, i1 %cond) {57; CHECK-LABEL: @xor_signbit_select_shl(58; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 859; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1677721660; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]61; CHECK-NEXT: ret i32 [[R]]62;63 %t0 = xor i32 %x, 4294901760 ; 0xFFFF000064 %t1 = select i1 %cond, i32 %t0, i32 %x65 %r = shl i32 %t1, 866 ret i32 %r67}68define i32 @xor_nosignbit_select_shl(i32 %x, i1 %cond) {69; CHECK-LABEL: @xor_nosignbit_select_shl(70; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 871; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -1677721672; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]73; CHECK-NEXT: ret i32 [[R]]74;75 %t0 = xor i32 %x, 2147418112 ; 0x7FFF000076 %t1 = select i1 %cond, i32 %t0, i32 %x77 %r = shl i32 %t1, 878 ret i32 %r79}80 81define i32 @add_signbit_select_shl(i32 %x, i1 %cond) {82; CHECK-LABEL: @add_signbit_select_shl(83; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 884; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], -1677721685; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]86; CHECK-NEXT: ret i32 [[R]]87;88 %t0 = add i32 %x, 4294901760 ; 0xFFFF000089 %t1 = select i1 %cond, i32 %t0, i32 %x90 %r = shl i32 %t1, 891 ret i32 %r92}93define i32 @add_nosignbit_select_shl(i32 %x, i1 %cond) {94; CHECK-LABEL: @add_nosignbit_select_shl(95; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 896; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], -1677721697; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]98; CHECK-NEXT: ret i32 [[R]]99;100 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000101 %t1 = select i1 %cond, i32 %t0, i32 %x102 %r = shl i32 %t1, 8103 ret i32 %r104}105 106; logical shift right107 108define i32 @and_signbit_select_lshr(i32 %x, i1 %cond) {109; CHECK-LABEL: @and_signbit_select_lshr(110; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8111; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 16776960112; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]113; CHECK-NEXT: ret i32 [[R]]114;115 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000116 %t1 = select i1 %cond, i32 %t0, i32 %x117 %r = lshr i32 %t1, 8118 ret i32 %r119}120define i32 @and_nosignbit_select_lshr(i32 %x, i1 %cond) {121; CHECK-LABEL: @and_nosignbit_select_lshr(122; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8123; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 8388352124; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]125; CHECK-NEXT: ret i32 [[R]]126;127 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000128 %t1 = select i1 %cond, i32 %t0, i32 %x129 %r = lshr i32 %t1, 8130 ret i32 %r131}132 133define i32 @or_signbit_select_lshr(i32 %x, i1 %cond) {134; CHECK-LABEL: @or_signbit_select_lshr(135; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8136; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], 16776960137; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]138; CHECK-NEXT: ret i32 [[R]]139;140 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000141 %t1 = select i1 %cond, i32 %t0, i32 %x142 %r = lshr i32 %t1, 8143 ret i32 %r144}145define i32 @or_nosignbit_select_lshr(i32 %x, i1 %cond) {146; CHECK-LABEL: @or_nosignbit_select_lshr(147; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8148; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], 8388352149; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]150; CHECK-NEXT: ret i32 [[R]]151;152 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000153 %t1 = select i1 %cond, i32 %t0, i32 %x154 %r = lshr i32 %t1, 8155 ret i32 %r156}157 158define i32 @xor_signbit_select_lshr(i32 %x, i1 %cond) {159; CHECK-LABEL: @xor_signbit_select_lshr(160; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8161; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 16776960162; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]163; CHECK-NEXT: ret i32 [[R]]164;165 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000166 %t1 = select i1 %cond, i32 %t0, i32 %x167 %r = lshr i32 %t1, 8168 ret i32 %r169}170define i32 @xor_nosignbit_select_lshr(i32 %x, i1 %cond) {171; CHECK-LABEL: @xor_nosignbit_select_lshr(172; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 8173; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 8388352174; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]175; CHECK-NEXT: ret i32 [[R]]176;177 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000178 %t1 = select i1 %cond, i32 %t0, i32 %x179 %r = lshr i32 %t1, 8180 ret i32 %r181}182 183define i32 @add_signbit_select_lshr(i32 %x, i1 %cond) {184; CHECK-LABEL: @add_signbit_select_lshr(185; CHECK-NEXT: [[T0:%.*]] = add i32 [[X:%.*]], -65536186; CHECK-NEXT: [[T1:%.*]] = select i1 [[COND:%.*]], i32 [[T0]], i32 [[X]]187; CHECK-NEXT: [[R:%.*]] = lshr i32 [[T1]], 8188; CHECK-NEXT: ret i32 [[R]]189;190 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000191 %t1 = select i1 %cond, i32 %t0, i32 %x192 %r = lshr i32 %t1, 8193 ret i32 %r194}195define i32 @add_nosignbit_select_lshr(i32 %x, i1 %cond) {196; CHECK-LABEL: @add_nosignbit_select_lshr(197; CHECK-NEXT: [[T0:%.*]] = add i32 [[X:%.*]], 2147418112198; CHECK-NEXT: [[T1:%.*]] = select i1 [[COND:%.*]], i32 [[T0]], i32 [[X]]199; CHECK-NEXT: [[R:%.*]] = lshr i32 [[T1]], 8200; CHECK-NEXT: ret i32 [[R]]201;202 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000203 %t1 = select i1 %cond, i32 %t0, i32 %x204 %r = lshr i32 %t1, 8205 ret i32 %r206}207 208; arithmetic shift right209 210define i32 @and_signbit_select_ashr(i32 %x, i1 %cond) {211; CHECK-LABEL: @and_signbit_select_ashr(212; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[X:%.*]], 8213; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], -256214; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]215; CHECK-NEXT: ret i32 [[R]]216;217 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000218 %t1 = select i1 %cond, i32 %t0, i32 %x219 %r = ashr i32 %t1, 8220 ret i32 %r221}222define i32 @and_nosignbit_select_ashr(i32 %x, i1 %cond) {223; CHECK-LABEL: @and_nosignbit_select_ashr(224; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[X:%.*]], 8225; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 8388352226; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]227; CHECK-NEXT: ret i32 [[R]]228;229 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000230 %t1 = select i1 %cond, i32 %t0, i32 %x231 %r = ashr i32 %t1, 8232 ret i32 %r233}234 235define i32 @or_signbit_select_ashr(i32 %x, i1 %cond) {236; CHECK-LABEL: @or_signbit_select_ashr(237; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[X:%.*]], 8238; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], -256239; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]240; CHECK-NEXT: ret i32 [[R]]241;242 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000243 %t1 = select i1 %cond, i32 %t0, i32 %x244 %r = ashr i32 %t1, 8245 ret i32 %r246}247define i32 @or_nosignbit_select_ashr(i32 %x, i1 %cond) {248; CHECK-LABEL: @or_nosignbit_select_ashr(249; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[X:%.*]], 8250; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], 8388352251; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]252; CHECK-NEXT: ret i32 [[R]]253;254 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000255 %t1 = select i1 %cond, i32 %t0, i32 %x256 %r = ashr i32 %t1, 8257 ret i32 %r258}259 260define i32 @xor_signbit_select_ashr(i32 %x, i1 %cond) {261; CHECK-LABEL: @xor_signbit_select_ashr(262; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[X:%.*]], 8263; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], -256264; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]265; CHECK-NEXT: ret i32 [[R]]266;267 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000268 %t1 = select i1 %cond, i32 %t0, i32 %x269 %r = ashr i32 %t1, 8270 ret i32 %r271}272define i32 @xor_nosignbit_select_ashr(i32 %x, i1 %cond) {273; CHECK-LABEL: @xor_nosignbit_select_ashr(274; CHECK-NEXT: [[TMP1:%.*]] = ashr i32 [[X:%.*]], 8275; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 8388352276; CHECK-NEXT: [[R:%.*]] = select i1 [[COND:%.*]], i32 [[TMP2]], i32 [[TMP1]]277; CHECK-NEXT: ret i32 [[R]]278;279 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000280 %t1 = select i1 %cond, i32 %t0, i32 %x281 %r = ashr i32 %t1, 8282 ret i32 %r283}284 285define i32 @add_signbit_select_ashr(i32 %x, i1 %cond) {286; CHECK-LABEL: @add_signbit_select_ashr(287; CHECK-NEXT: [[T0:%.*]] = add i32 [[X:%.*]], -65536288; CHECK-NEXT: [[T1:%.*]] = select i1 [[COND:%.*]], i32 [[T0]], i32 [[X]]289; CHECK-NEXT: [[R:%.*]] = ashr i32 [[T1]], 8290; CHECK-NEXT: ret i32 [[R]]291;292 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000293 %t1 = select i1 %cond, i32 %t0, i32 %x294 %r = ashr i32 %t1, 8295 ret i32 %r296}297define i32 @add_nosignbit_select_ashr(i32 %x, i1 %cond) {298; CHECK-LABEL: @add_nosignbit_select_ashr(299; CHECK-NEXT: [[T0:%.*]] = add i32 [[X:%.*]], 2147418112300; CHECK-NEXT: [[T1:%.*]] = select i1 [[COND:%.*]], i32 [[T0]], i32 [[X]]301; CHECK-NEXT: [[R:%.*]] = ashr i32 [[T1]], 8302; CHECK-NEXT: ret i32 [[R]]303;304 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000305 %t1 = select i1 %cond, i32 %t0, i32 %x306 %r = ashr i32 %t1, 8307 ret i32 %r308}309