1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4define i32 @select_or_icmp(i32 %x, i32 %y, i32 %z) { 5; CHECK-LABEL: @select_or_icmp( 6; CHECK-NEXT: ret i32 [[Z:%.*]] 7; 8 %A = icmp ne i32 %x, %z 9 %B = icmp ne i32 %y, %z 10 %C = or i1 %A, %B 11 %D = select i1 %C, i32 %z, i32 %x 12 ret i32 %D 13} 14 15define <2 x i8> @select_or_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { 16; CHECK-LABEL: @select_or_icmp_vec( 17; CHECK-NEXT: ret <2 x i8> [[Z:%.*]] 18; 19 %A = icmp ne <2 x i8> %x, %z 20 %B = icmp ne <2 x i8> %y, %z 21 %C = or <2 x i1> %A, %B 22 %D = select <2 x i1> %C, <2 x i8> %z, <2 x i8> %x 23 ret <2 x i8> %D 24} 25 26define i32 @select_or_icmp2(i32 %x, i32 %y, i32 %z) { 27; CHECK-LABEL: @select_or_icmp2( 28; CHECK-NEXT: ret i32 [[Z:%.*]] 29; 30 %A = icmp ne i32 %x, %z 31 %B = icmp ne i32 %y, %z 32 %C = or i1 %A, %B 33 %D = select i1 %C, i32 %z, i32 %y 34 ret i32 %D 35} 36 37define i32 @select_or_icmp_alt(i32 %x, i32 %y, i32 %z) { 38; CHECK-LABEL: @select_or_icmp_alt( 39; CHECK-NEXT: ret i32 [[X:%.*]] 40; 41 %A = icmp ne i32 %x, %z 42 %B = icmp ne i32 %y, %z 43 %C = or i1 %A, %B 44 %D = select i1 %C, i32 %x, i32 %z 45 ret i32 %D 46} 47 48define i32 @select_or_icmp_alt2(i32 %x, i32 %y, i32 %z) { 49; CHECK-LABEL: @select_or_icmp_alt2( 50; CHECK-NEXT: ret i32 [[Y:%.*]] 51; 52 %A = icmp ne i32 %x, %z 53 %B = icmp ne i32 %y, %z 54 %C = or i1 %A, %B 55 %D = select i1 %C, i32 %y, i32 %z 56 ret i32 %D 57} 58 59define i32 @select_or_icmp_inv_alt(i32 %x, i32 %y, i32 %z) { 60; CHECK-LABEL: @select_or_icmp_inv_alt( 61; CHECK-NEXT: ret i32 [[X:%.*]] 62; 63 %A = icmp ne i32 %z, %x 64 %B = icmp ne i32 %z, %y 65 %C = or i1 %A, %B 66 %D = select i1 %C, i32 %x, i32 %z 67 ret i32 %D 68} 69 70define i32 @select_or_inv_icmp_alt(i32 %x, i32 %y, i32 %z) { 71; CHECK-LABEL: @select_or_inv_icmp_alt( 72; CHECK-NEXT: ret i32 [[X:%.*]] 73; 74 %A = icmp ne i32 %z, %x 75 %B = icmp ne i32 %z, %y 76 %C = or i1 %B, %A 77 %D = select i1 %C, i32 %x, i32 %z 78 ret i32 %D 79} 80 81define <2 x i8> @select_or_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) { 82; CHECK-LABEL: @select_or_icmp_alt_vec( 83; CHECK-NEXT: ret <2 x i8> [[X:%.*]] 84; 85 %A = icmp ne <2 x i8> %x, %z 86 %B = icmp ne <2 x i8> %y, %z 87 %C = or <2 x i1> %A, %B 88 %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z 89 ret <2 x i8> %D 90} 91 92define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) { 93; CHECK-LABEL: @select_or_inv_icmp( 94; CHECK-NEXT: ret i32 [[Z:%.*]] 95; 96 %A = icmp ne i32 %x, %z 97 %B = icmp ne i32 %y, %z 98 %C = or i1 %B , %A 99 %D = select i1 %C, i32 %z, i32 %x 100 ret i32 %D 101} 102 103define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) { 104; CHECK-LABEL: @select_or_icmp_inv( 105; CHECK-NEXT: ret i32 [[Z:%.*]] 106; 107 %A = icmp ne i32 %z, %x 108 %B = icmp ne i32 %z, %y 109 %C = or i1 %A, %B 110 %D = select i1 %C, i32 %z, i32 %x 111 ret i32 %D 112} 113 114 115; Below used to be negative tests in InstSimplify, but are no more negative cases here 116 117define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) { 118; CHECK-LABEL: @select_and_icmp_pred_bad_1( 119; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]] 120; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[X]], i32 [[Z]] 121; CHECK-NEXT: ret i32 [[D]] 122; 123 %A = icmp eq i32 %x, %z 124 %B = icmp ne i32 %y, %z 125 %C = or i1 %A, %B 126 %D = select i1 %C, i32 %z, i32 %x 127 ret i32 %D 128} 129 130define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) { 131; CHECK-LABEL: @select_and_icmp_pred_bad_2( 132; CHECK-NEXT: ret i32 [[Z]] 133; 134 %A = icmp ne i32 %x, %z 135 %B = icmp eq i32 %y, %z 136 %C = or i1 %A, %B 137 %D = select i1 %C, i32 %z, i32 %x 138 ret i32 %D 139} 140 141define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) { 142; CHECK-LABEL: @select_and_icmp_pred_bad_3( 143; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]] 144; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]] 145; CHECK-NEXT: ret i32 [[D]] 146; 147 %A = icmp eq i32 %x, %z 148 %B = icmp eq i32 %y, %z 149 %C = or i1 %A, %B 150 %D = select i1 %C, i32 %z, i32 %x 151 ret i32 %D 152} 153 154define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) { 155; CHECK-LABEL: @select_and_icmp_pred_bad_4( 156; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]] 157; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[X]], i32 [[Z]] 158; CHECK-NEXT: ret i32 [[D]] 159; 160 %A = icmp ne i32 %x, %z 161 %B = icmp ne i32 %y, %z 162 %C = and i1 %A, %B 163 %D = select i1 %C, i32 %z, i32 %x 164 ret i32 %D 165} 166 167define i32 @select_or_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) { 168; CHECK-LABEL: @select_or_icmp_alt_bad_1( 169; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]] 170; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X]] 171; CHECK-NEXT: ret i32 [[D]] 172; 173 %A = icmp eq i32 %x, %z 174 %B = icmp ne i32 %y, %z 175 %C = or i1 %A, %B 176 %D = select i1 %C, i32 %x, i32 %z 177 ret i32 %D 178} 179 180define i32 @select_or_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) { 181; CHECK-LABEL: @select_or_icmp_alt_bad_2( 182; CHECK-NEXT: ret i32 [[X]] 183; 184 %A = icmp ne i32 %x, %z 185 %B = icmp eq i32 %y, %z 186 %C = or i1 %A, %B 187 %D = select i1 %C, i32 %x, i32 %z 188 ret i32 %D 189} 190 191define i32 @select_or_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) { 192; CHECK-LABEL: @select_or_icmp_alt_bad_3( 193; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]] 194; CHECK-NEXT: [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]] 195; CHECK-NEXT: ret i32 [[D]] 196; 197 %A = icmp eq i32 %x, %z 198 %B = icmp eq i32 %y, %z 199 %C = or i1 %A, %B 200 %D = select i1 %C, i32 %x, i32 %z 201 ret i32 %D 202} 203 204define i32 @select_or_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) { 205; CHECK-LABEL: @select_or_icmp_alt_bad_4( 206; CHECK-NEXT: [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]] 207; CHECK-NEXT: [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X]] 208; CHECK-NEXT: ret i32 [[D]] 209; 210 %A = icmp ne i32 %x, %z 211 %B = icmp ne i32 %y, %z 212 %C = and i1 %A, %B 213 %D = select i1 %C, i32 %x, i32 %z 214 ret i32 %D 215} 216 217 218; Negative tests 219 220define i32 @select_or_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) { 221; CHECK-LABEL: @select_or_icmp_bad_true_val( 222; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]] 223; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]] 224; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]] 225; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]] 226; CHECK-NEXT: ret i32 [[D]] 227; 228 %A = icmp ne i32 %x, %z 229 %B = icmp ne i32 %y, %z 230 %C = or i1 %A, %B 231 %D = select i1 %C, i32 %k, i32 %x 232 ret i32 %D 233} 234 235define i32 @select_or_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) { 236; CHECK-LABEL: @select_or_icmp_bad_false_val( 237; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]] 238; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]] 239; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]] 240; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]] 241; CHECK-NEXT: ret i32 [[D]] 242; 243 %A = icmp ne i32 %x, %z 244 %B = icmp ne i32 %y, %z 245 %C = or i1 %A, %B 246 %D = select i1 %C, i32 %z, i32 %k 247 ret i32 %D 248} 249 250define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) { 251; CHECK-LABEL: @select_or_icmp_bad_op( 252; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[K:%.*]], [[Z:%.*]] 253; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]] 254; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]] 255; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]] 256; CHECK-NEXT: ret i32 [[D]] 257; 258 %A = icmp ne i32 %k, %z 259 %B = icmp ne i32 %y, %z 260 %C = or i1 %A, %B 261 %D = select i1 %C, i32 %z, i32 %x 262 ret i32 %D 263} 264 265define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) { 266; CHECK-LABEL: @select_or_icmp_bad_op_2( 267; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]] 268; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]] 269; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]] 270; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]] 271; CHECK-NEXT: ret i32 [[D]] 272; 273 %A = icmp ne i32 %x, %k 274 %B = icmp ne i32 %y, %z 275 %C = or i1 %A, %B 276 %D = select i1 %C, i32 %z, i32 %x 277 ret i32 %D 278} 279 280define i32 @select_or_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) { 281; CHECK-LABEL: @select_or_icmp_alt_bad_5( 282; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]] 283; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]] 284; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]] 285; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]] 286; CHECK-NEXT: ret i32 [[D]] 287; 288 %A = icmp ne i32 %x, %k 289 %B = icmp ne i32 %y, %z 290 %C = or i1 %A, %B 291 %D = select i1 %C, i32 %x, i32 %z 292 ret i32 %D 293} 294 295define i32 @select_or_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) { 296; CHECK-LABEL: @select_or_icmp_alt_bad_true_val( 297; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]] 298; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]] 299; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]] 300; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]] 301; CHECK-NEXT: ret i32 [[D]] 302; 303 %A = icmp ne i32 %x, %z 304 %B = icmp ne i32 %y, %z 305 %C = or i1 %A, %B 306 %D = select i1 %C, i32 %k, i32 %z 307 ret i32 %D 308} 309 310define i32 @select_or_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) { 311; CHECK-LABEL: @select_or_icmp_alt_bad_false_val( 312; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]] 313; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]] 314; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]] 315; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]] 316; CHECK-NEXT: ret i32 [[D]] 317; 318 %A = icmp ne i32 %x, %z 319 %B = icmp ne i32 %y, %z 320 %C = or i1 %A, %B 321 %D = select i1 %C, i32 %x, i32 %k 322 ret i32 %D 323} 324