193 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4; Test all integer predicates with bool types and true/false constants,5; with not on LHS (icmp pred (xor X, true), true|false).6; Use vectors to provide test coverage that is not duplicated in other folds.7 8define <2 x i1> @eq_t_not(<2 x i1> %a) {9; CHECK-LABEL: @eq_t_not(10; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)11; CHECK-NEXT: ret <2 x i1> [[NOT]]12;13 %not = xor <2 x i1> %a, <i1 true, i1 true>14 %r = icmp eq <2 x i1> %not, <i1 true, i1 true>15 ret <2 x i1> %r16}17 18define <2 x i1> @eq_f_not(<2 x i1> %a) {19; CHECK-LABEL: @eq_f_not(20; CHECK-NEXT: ret <2 x i1> [[A:%.*]]21;22 %not = xor <2 x i1> %a, <i1 true, i1 true>23 %r = icmp eq <2 x i1> %not, <i1 false, i1 false>24 ret <2 x i1> %r25}26 27define <2 x i1> @ne_t_not(<2 x i1> %a) {28; CHECK-LABEL: @ne_t_not(29; CHECK-NEXT: ret <2 x i1> [[A:%.*]]30;31 %not = xor <2 x i1> %a, <i1 true, i1 true>32 %r = icmp ne <2 x i1> %not, <i1 true, i1 true>33 ret <2 x i1> %r34}35 36define <2 x i1> @ne_f_not(<2 x i1> %a) {37; CHECK-LABEL: @ne_f_not(38; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)39; CHECK-NEXT: ret <2 x i1> [[NOT]]40;41 %not = xor <2 x i1> %a, <i1 true, i1 true>42 %r = icmp ne <2 x i1> %not, <i1 false, i1 false>43 ret <2 x i1> %r44}45 46define <2 x i1> @ugt_t_not(<2 x i1> %a) {47; CHECK-LABEL: @ugt_t_not(48; CHECK-NEXT: ret <2 x i1> zeroinitializer49;50 %not = xor <2 x i1> %a, <i1 true, i1 true>51 %r = icmp ugt <2 x i1> %not, <i1 true, i1 true>52 ret <2 x i1> %r53}54 55define <2 x i1> @ugt_f_not(<2 x i1> %a) {56; CHECK-LABEL: @ugt_f_not(57; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)58; CHECK-NEXT: ret <2 x i1> [[NOT]]59;60 %not = xor <2 x i1> %a, <i1 true, i1 true>61 %r = icmp ugt <2 x i1> %not, <i1 false, i1 false>62 ret <2 x i1> %r63}64 65define <2 x i1> @ult_t_not(<2 x i1> %a) {66; CHECK-LABEL: @ult_t_not(67; CHECK-NEXT: ret <2 x i1> [[A:%.*]]68;69 %not = xor <2 x i1> %a, <i1 true, i1 true>70 %r = icmp ult <2 x i1> %not, <i1 true, i1 true>71 ret <2 x i1> %r72}73 74define <2 x i1> @ult_f_not(<2 x i1> %a) {75; CHECK-LABEL: @ult_f_not(76; CHECK-NEXT: ret <2 x i1> zeroinitializer77;78 %not = xor <2 x i1> %a, <i1 true, i1 true>79 %r = icmp ult <2 x i1> %not, <i1 false, i1 false>80 ret <2 x i1> %r81}82 83define <2 x i1> @sgt_t_not(<2 x i1> %a) {84; CHECK-LABEL: @sgt_t_not(85; CHECK-NEXT: ret <2 x i1> [[A:%.*]]86;87 %not = xor <2 x i1> %a, <i1 true, i1 true>88 %r = icmp sgt <2 x i1> %not, <i1 true, i1 true>89 ret <2 x i1> %r90}91 92define <2 x i1> @sgt_f_not(<2 x i1> %a) {93; CHECK-LABEL: @sgt_f_not(94; CHECK-NEXT: ret <2 x i1> zeroinitializer95;96 %not = xor <2 x i1> %a, <i1 true, i1 true>97 %r = icmp sgt <2 x i1> %not, <i1 false, i1 false>98 ret <2 x i1> %r99}100 101define <2 x i1> @slt_t_not(<2 x i1> %a) {102; CHECK-LABEL: @slt_t_not(103; CHECK-NEXT: ret <2 x i1> zeroinitializer104;105 %not = xor <2 x i1> %a, <i1 true, i1 true>106 %r = icmp slt <2 x i1> %not, <i1 true, i1 true>107 ret <2 x i1> %r108}109 110define <2 x i1> @slt_f_not(<2 x i1> %a) {111; CHECK-LABEL: @slt_f_not(112; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)113; CHECK-NEXT: ret <2 x i1> [[NOT]]114;115 %not = xor <2 x i1> %a, <i1 true, i1 true>116 %r = icmp slt <2 x i1> %not, <i1 false, i1 false>117 ret <2 x i1> %r118}119 120define <2 x i1> @uge_t_not(<2 x i1> %a) {121; CHECK-LABEL: @uge_t_not(122; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)123; CHECK-NEXT: ret <2 x i1> [[NOT]]124;125 %not = xor <2 x i1> %a, <i1 true, i1 true>126 %r = icmp uge <2 x i1> %not, <i1 true, i1 true>127 ret <2 x i1> %r128}129 130define <2 x i1> @uge_f_not(<2 x i1> %a) {131; CHECK-LABEL: @uge_f_not(132; CHECK-NEXT: ret <2 x i1> splat (i1 true)133;134 %not = xor <2 x i1> %a, <i1 true, i1 true>135 %r = icmp uge <2 x i1> %not, <i1 false, i1 false>136 ret <2 x i1> %r137}138 139define <2 x i1> @ule_t_not(<2 x i1> %a) {140; CHECK-LABEL: @ule_t_not(141; CHECK-NEXT: ret <2 x i1> splat (i1 true)142;143 %not = xor <2 x i1> %a, <i1 true, i1 true>144 %r = icmp ule <2 x i1> %not, <i1 true, i1 true>145 ret <2 x i1> %r146}147 148define <2 x i1> @ule_f_not(<2 x i1> %a) {149; CHECK-LABEL: @ule_f_not(150; CHECK-NEXT: ret <2 x i1> [[A:%.*]]151;152 %not = xor <2 x i1> %a, <i1 true, i1 true>153 %r = icmp ule <2 x i1> %not, <i1 false, i1 false>154 ret <2 x i1> %r155}156 157define <2 x i1> @sge_t_not(<2 x i1> %a) {158; CHECK-LABEL: @sge_t_not(159; CHECK-NEXT: ret <2 x i1> splat (i1 true)160;161 %not = xor <2 x i1> %a, <i1 true, i1 true>162 %r = icmp sge <2 x i1> %not, <i1 true, i1 true>163 ret <2 x i1> %r164}165 166define <2 x i1> @sge_f_not(<2 x i1> %a) {167; CHECK-LABEL: @sge_f_not(168; CHECK-NEXT: ret <2 x i1> [[A:%.*]]169;170 %not = xor <2 x i1> %a, <i1 true, i1 true>171 %r = icmp sge <2 x i1> %not, <i1 false, i1 false>172 ret <2 x i1> %r173}174 175define <2 x i1> @sle_t_not(<2 x i1> %a) {176; CHECK-LABEL: @sle_t_not(177; CHECK-NEXT: [[NOT:%.*]] = xor <2 x i1> [[A:%.*]], splat (i1 true)178; CHECK-NEXT: ret <2 x i1> [[NOT]]179;180 %not = xor <2 x i1> %a, <i1 true, i1 true>181 %r = icmp sle <2 x i1> %not, <i1 true, i1 true>182 ret <2 x i1> %r183}184 185define <2 x i1> @sle_f_not(<2 x i1> %a) {186; CHECK-LABEL: @sle_f_not(187; CHECK-NEXT: ret <2 x i1> splat (i1 true)188;189 %not = xor <2 x i1> %a, <i1 true, i1 true>190 %r = icmp sle <2 x i1> %not, <i1 false, i1 false>191 ret <2 x i1> %r192}193