brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · e688391 Raw
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