185 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4declare i8 @llvm.smin.i8(i8, i8)5declare i8 @llvm.umin.i8(i8, i8)6declare i8 @llvm.smax.i8(i8, i8)7declare i8 @llvm.umax.i8(i8, i8)8declare <2 x i8> @llvm.smin.v2i8(<2 x i8>, <2 x i8>)9declare <2 x i8> @llvm.umin.v2i8(<2 x i8>, <2 x i8>)10declare <2 x i8> @llvm.smax.v2i8(<2 x i8>, <2 x i8>)11declare <2 x i8> @llvm.umax.v2i8(<2 x i8>, <2 x i8>)12 13declare void @llvm.assume(i1)14declare void @barrier()15 16define <2 x i8> @umax_xor_Cpow2(<2 x i8> %x) {17; CHECK-LABEL: @umax_xor_Cpow2(18; CHECK-NEXT: [[R:%.*]] = or <2 x i8> [[X:%.*]], splat (i8 -128)19; CHECK-NEXT: ret <2 x i8> [[R]]20;21 %x_xor = xor <2 x i8> %x, <i8 128, i8 128>22 %r = call <2 x i8> @llvm.umax.v2i8(<2 x i8> %x, <2 x i8> %x_xor)23 ret <2 x i8> %r24}25 26define i8 @umin_xor_Cpow2(i8 %x) {27; CHECK-LABEL: @umin_xor_Cpow2(28; CHECK-NEXT: [[R:%.*]] = and i8 [[X:%.*]], -6529; CHECK-NEXT: ret i8 [[R]]30;31 %x_xor = xor i8 %x, 6432 %r = call i8 @llvm.umin.i8(i8 %x, i8 %x_xor)33 ret i8 %r34}35 36define i8 @smax_xor_Cpow2_pos(i8 %x) {37; CHECK-LABEL: @smax_xor_Cpow2_pos(38; CHECK-NEXT: [[R:%.*]] = or i8 [[X:%.*]], 3239; CHECK-NEXT: ret i8 [[R]]40;41 %x_xor = xor i8 %x, 3242 %r = call i8 @llvm.smax.i8(i8 %x, i8 %x_xor)43 ret i8 %r44}45 46define <2 x i8> @smin_xor_Cpow2_pos(<2 x i8> %x) {47; CHECK-LABEL: @smin_xor_Cpow2_pos(48; CHECK-NEXT: [[R:%.*]] = and <2 x i8> [[X:%.*]], splat (i8 -17)49; CHECK-NEXT: ret <2 x i8> [[R]]50;51 %x_xor = xor <2 x i8> %x, <i8 16, i8 16>52 %r = call <2 x i8> @llvm.smin.v2i8(<2 x i8> %x, <2 x i8> %x_xor)53 ret <2 x i8> %r54}55 56define <2 x i8> @smax_xor_Cpow2_neg(<2 x i8> %x) {57; CHECK-LABEL: @smax_xor_Cpow2_neg(58; CHECK-NEXT: [[R:%.*]] = and <2 x i8> [[X:%.*]], splat (i8 127)59; CHECK-NEXT: ret <2 x i8> [[R]]60;61 %x_xor = xor <2 x i8> %x, <i8 128, i8 128>62 %r = call <2 x i8> @llvm.smax.v2i8(<2 x i8> %x, <2 x i8> %x_xor)63 ret <2 x i8> %r64}65 66define i8 @smin_xor_Cpow2_neg(i8 %x) {67; CHECK-LABEL: @smin_xor_Cpow2_neg(68; CHECK-NEXT: [[R:%.*]] = or i8 [[X:%.*]], -12869; CHECK-NEXT: ret i8 [[R]]70;71 %x_xor = xor i8 %x, 12872 %r = call i8 @llvm.smin.i8(i8 %x, i8 %x_xor)73 ret i8 %r74}75 76define i8 @umax_xor_pow2(i8 %x, i8 %y) {77; CHECK-LABEL: @umax_xor_pow2(78; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]79; CHECK-NEXT: [[YP2:%.*]] = and i8 [[Y]], [[NY]]80; CHECK-NEXT: [[R:%.*]] = or i8 [[X:%.*]], [[YP2]]81; CHECK-NEXT: ret i8 [[R]]82;83 %ny = sub i8 0, %y84 %yp2 = and i8 %y, %ny85 %x_xor = xor i8 %x, %yp286 %r = call i8 @llvm.umax.i8(i8 %x, i8 %x_xor)87 ret i8 %r88}89 90define <2 x i8> @umin_xor_pow2(<2 x i8> %x, <2 x i8> %y) {91; CHECK-LABEL: @umin_xor_pow2(92; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]93; CHECK-NEXT: [[YP2:%.*]] = and <2 x i8> [[Y]], [[NY]]94; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i8> [[YP2]], splat (i8 -1)95; CHECK-NEXT: [[R:%.*]] = and <2 x i8> [[X:%.*]], [[TMP1]]96; CHECK-NEXT: ret <2 x i8> [[R]]97;98 %ny = sub <2 x i8> <i8 0, i8 0>, %y99 %yp2 = and <2 x i8> %y, %ny100 %x_xor = xor <2 x i8> %x, %yp2101 %r = call <2 x i8> @llvm.umin.v2i8(<2 x i8> %x, <2 x i8> %x_xor)102 ret <2 x i8> %r103}104 105define i8 @smax_xor_pow2_unk(i8 %x, i8 %y) {106; CHECK-LABEL: @smax_xor_pow2_unk(107; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]108; CHECK-NEXT: [[YP2:%.*]] = and i8 [[Y]], [[NY]]109; CHECK-NEXT: [[X_XOR:%.*]] = xor i8 [[X:%.*]], [[YP2]]110; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 [[X_XOR]])111; CHECK-NEXT: ret i8 [[R]]112;113 %ny = sub i8 0, %y114 %yp2 = and i8 %y, %ny115 %x_xor = xor i8 %x, %yp2116 %r = call i8 @llvm.smax.i8(i8 %x, i8 %x_xor)117 ret i8 %r118}119 120define <2 x i8> @smin_xor_pow2_unk(<2 x i8> %x, <2 x i8> %y) {121; CHECK-LABEL: @smin_xor_pow2_unk(122; CHECK-NEXT: [[NY:%.*]] = sub <2 x i8> zeroinitializer, [[Y:%.*]]123; CHECK-NEXT: [[YP2:%.*]] = and <2 x i8> [[Y]], [[NY]]124; CHECK-NEXT: [[X_XOR:%.*]] = xor <2 x i8> [[X:%.*]], [[YP2]]125; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.smin.v2i8(<2 x i8> [[X]], <2 x i8> [[X_XOR]])126; CHECK-NEXT: ret <2 x i8> [[R]]127;128 %ny = sub <2 x i8> <i8 0, i8 0>, %y129 %yp2 = and <2 x i8> %y, %ny130 %x_xor = xor <2 x i8> %x, %yp2131 %r = call <2 x i8> @llvm.smin.v2i8(<2 x i8> %x, <2 x i8> %x_xor)132 ret <2 x i8> %r133}134 135define i8 @smax_xor_pow2_neg(i8 %x, i8 %y) {136; CHECK-LABEL: @smax_xor_pow2_neg(137; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[Y:%.*]], -128138; CHECK-NEXT: br i1 [[CMP]], label [[NEG:%.*]], label [[POS:%.*]]139; CHECK: neg:140; CHECK-NEXT: [[R:%.*]] = and i8 [[X:%.*]], 127141; CHECK-NEXT: ret i8 [[R]]142; CHECK: pos:143; CHECK-NEXT: call void @barrier()144; CHECK-NEXT: ret i8 0145;146 %ny = sub i8 0, %y147 %yp2 = and i8 %y, %ny148 %cmp = icmp slt i8 %yp2, 0149 br i1 %cmp, label %neg, label %pos150neg:151 %x_xor = xor i8 %x, %yp2152 %r = call i8 @llvm.smax.i8(i8 %x, i8 %x_xor)153 ret i8 %r154pos:155 call void @barrier()156 ret i8 0157}158 159define i8 @smin_xor_pow2_pos(i8 %x, i8 %y) {160; CHECK-LABEL: @smin_xor_pow2_pos(161; CHECK-NEXT: [[NY:%.*]] = sub i8 0, [[Y:%.*]]162; CHECK-NEXT: [[YP2:%.*]] = and i8 [[Y]], [[NY]]163; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[YP2]], 0164; CHECK-NEXT: br i1 [[CMP]], label [[NEG:%.*]], label [[POS:%.*]]165; CHECK: neg:166; CHECK-NEXT: [[TMP1:%.*]] = xor i8 [[YP2]], -1167; CHECK-NEXT: [[R:%.*]] = and i8 [[X:%.*]], [[TMP1]]168; CHECK-NEXT: ret i8 [[R]]169; CHECK: pos:170; CHECK-NEXT: call void @barrier()171; CHECK-NEXT: ret i8 0172;173 %ny = sub i8 0, %y174 %yp2 = and i8 %y, %ny175 %cmp = icmp sgt i8 %yp2, 0176 br i1 %cmp, label %neg, label %pos177neg:178 %x_xor = xor i8 %x, %yp2179 %r = call i8 @llvm.smin.i8(i8 %x, i8 %x_xor)180 ret i8 %r181pos:182 call void @barrier()183 ret i8 0184}185