1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3 4declare void @foo() 5 6define i1 @test1(i32 %a, i32 %b) { 7; CHECK-LABEL: @test1( 8; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A:%.*]], [[B:%.*]] 9; CHECK-NEXT: [[OR_COND:%.*]] = icmp slt i32 [[TMP1]], 0 10; CHECK-NEXT: ret i1 [[OR_COND]] 11; 12 %1 = icmp slt i32 %a, 0 13 %2 = icmp slt i32 %b, 0 14 %or.cond = or i1 %1, %2 15 ret i1 %or.cond 16} 17 18define <2 x i1> @test1_splat(<2 x i32> %a, <2 x i32> %b) { 19; CHECK-LABEL: @test1_splat( 20; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[A:%.*]], [[B:%.*]] 21; CHECK-NEXT: [[OR_COND:%.*]] = icmp slt <2 x i32> [[TMP1]], zeroinitializer 22; CHECK-NEXT: ret <2 x i1> [[OR_COND]] 23; 24 %1 = icmp slt <2 x i32> %a, zeroinitializer 25 %2 = icmp slt <2 x i32> %b, zeroinitializer 26 %or.cond = or <2 x i1> %1, %2 27 ret <2 x i1> %or.cond 28} 29 30define i1 @test1_logical(i32 %a, i32 %b) { 31; CHECK-LABEL: @test1_logical( 32; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 0 33; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[B:%.*]], 0 34; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 true, i1 [[TMP2]] 35; CHECK-NEXT: ret i1 [[OR_COND]] 36; 37 %1 = icmp slt i32 %a, 0 38 %2 = icmp slt i32 %b, 0 39 %or.cond = select i1 %1, i1 true, i1 %2 40 ret i1 %or.cond 41} 42 43define i1 @test2(i32 %a, i32 %b) { 44; CHECK-LABEL: @test2( 45; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], [[B:%.*]] 46; CHECK-NEXT: [[OR_COND:%.*]] = icmp sgt i32 [[TMP1]], -1 47; CHECK-NEXT: ret i1 [[OR_COND]] 48; 49 %1 = icmp sgt i32 %a, -1 50 %2 = icmp sgt i32 %b, -1 51 %or.cond = or i1 %1, %2 52 ret i1 %or.cond 53} 54 55define i1 @test2_logical(i32 %a, i32 %b) { 56; CHECK-LABEL: @test2_logical( 57; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -1 58; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[B:%.*]], -1 59; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 true, i1 [[TMP2]] 60; CHECK-NEXT: ret i1 [[OR_COND]] 61; 62 %1 = icmp sgt i32 %a, -1 63 %2 = icmp sgt i32 %b, -1 64 %or.cond = select i1 %1, i1 true, i1 %2 65 ret i1 %or.cond 66} 67 68define i1 @test3(i32 %a, i32 %b) { 69; CHECK-LABEL: @test3( 70; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], [[B:%.*]] 71; CHECK-NEXT: [[OR_COND:%.*]] = icmp slt i32 [[TMP1]], 0 72; CHECK-NEXT: ret i1 [[OR_COND]] 73; 74 %1 = icmp slt i32 %a, 0 75 %2 = icmp slt i32 %b, 0 76 %or.cond = and i1 %1, %2 77 ret i1 %or.cond 78} 79 80define i1 @test3_logical(i32 %a, i32 %b) { 81; CHECK-LABEL: @test3_logical( 82; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[A:%.*]], 0 83; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[B:%.*]], 0 84; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false 85; CHECK-NEXT: ret i1 [[OR_COND]] 86; 87 %1 = icmp slt i32 %a, 0 88 %2 = icmp slt i32 %b, 0 89 %or.cond = select i1 %1, i1 %2, i1 false 90 ret i1 %or.cond 91} 92 93define i1 @test4(i32 %a, i32 %b) { 94; CHECK-LABEL: @test4( 95; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[A:%.*]], [[B:%.*]] 96; CHECK-NEXT: [[OR_COND:%.*]] = icmp sgt i32 [[TMP1]], -1 97; CHECK-NEXT: ret i1 [[OR_COND]] 98; 99 %1 = icmp sgt i32 %a, -1 100 %2 = icmp sgt i32 %b, -1 101 %or.cond = and i1 %1, %2 102 ret i1 %or.cond 103} 104 105define i1 @test4_logical(i32 %a, i32 %b) { 106; CHECK-LABEL: @test4_logical( 107; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[A:%.*]], -1 108; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[B:%.*]], -1 109; CHECK-NEXT: [[OR_COND:%.*]] = select i1 [[TMP1]], i1 [[TMP2]], i1 false 110; CHECK-NEXT: ret i1 [[OR_COND]] 111; 112 %1 = icmp sgt i32 %a, -1 113 %2 = icmp sgt i32 %b, -1 114 %or.cond = select i1 %1, i1 %2, i1 false 115 ret i1 %or.cond 116} 117 118define void @test5(i32 %a) { 119; CHECK-LABEL: @test5( 120; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 121; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0 122; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 123; CHECK: if.then: 124; CHECK-NEXT: tail call void @foo() #[[ATTR0:[0-9]+]] 125; CHECK-NEXT: ret void 126; CHECK: if.end: 127; CHECK-NEXT: ret void 128; 129 %and = and i32 %a, 134217728 130 %1 = icmp eq i32 %and, 0 131 %2 = icmp sgt i32 %a, -1 132 %or.cond = and i1 %1, %2 133 br i1 %or.cond, label %if.then, label %if.end 134 135 136if.then: 137 tail call void @foo() nounwind 138 ret void 139 140if.end: 141 ret void 142} 143 144define void @test5_logical(i32 %a) { 145; CHECK-LABEL: @test5_logical( 146; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 147; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0 148; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 149; CHECK: if.then: 150; CHECK-NEXT: tail call void @foo() #[[ATTR0]] 151; CHECK-NEXT: ret void 152; CHECK: if.end: 153; CHECK-NEXT: ret void 154; 155 %and = and i32 %a, 134217728 156 %1 = icmp eq i32 %and, 0 157 %2 = icmp sgt i32 %a, -1 158 %or.cond = select i1 %1, i1 %2, i1 false 159 br i1 %or.cond, label %if.then, label %if.end 160 161 162if.then: 163 tail call void @foo() nounwind 164 ret void 165 166if.end: 167 ret void 168} 169 170define void @test6(i32 %a) { 171; CHECK-LABEL: @test6( 172; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 173; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0 174; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 175; CHECK: if.then: 176; CHECK-NEXT: tail call void @foo() #[[ATTR0]] 177; CHECK-NEXT: ret void 178; CHECK: if.end: 179; CHECK-NEXT: ret void 180; 181 %1 = icmp sgt i32 %a, -1 182 %and = and i32 %a, 134217728 183 %2 = icmp eq i32 %and, 0 184 %or.cond = and i1 %1, %2 185 br i1 %or.cond, label %if.then, label %if.end 186 187 188if.then: 189 tail call void @foo() nounwind 190 ret void 191 192if.end: 193 ret void 194} 195 196define void @test6_logical(i32 %a) { 197; CHECK-LABEL: @test6_logical( 198; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 199; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 0 200; CHECK-NEXT: br i1 [[OR_COND]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 201; CHECK: if.then: 202; CHECK-NEXT: tail call void @foo() #[[ATTR0]] 203; CHECK-NEXT: ret void 204; CHECK: if.end: 205; CHECK-NEXT: ret void 206; 207 %1 = icmp sgt i32 %a, -1 208 %and = and i32 %a, 134217728 209 %2 = icmp eq i32 %and, 0 210 %or.cond = select i1 %1, i1 %2, i1 false 211 br i1 %or.cond, label %if.then, label %if.end 212 213 214if.then: 215 tail call void @foo() nounwind 216 ret void 217 218if.end: 219 ret void 220} 221 222define void @test7(i32 %a) { 223; CHECK-LABEL: @test7( 224; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 225; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0 226; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 227; CHECK: if.then: 228; CHECK-NEXT: tail call void @foo() #[[ATTR0]] 229; CHECK-NEXT: ret void 230; CHECK: if.end: 231; CHECK-NEXT: ret void 232; 233 %and = and i32 %a, 134217728 234 %1 = icmp ne i32 %and, 0 235 %2 = icmp slt i32 %a, 0 236 %or.cond = or i1 %1, %2 237 br i1 %or.cond, label %if.then, label %if.end 238 239 240if.then: 241 tail call void @foo() nounwind 242 ret void 243 244if.end: 245 ret void 246} 247 248define void @test7_logical(i32 %a) { 249; CHECK-LABEL: @test7_logical( 250; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 251; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0 252; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 253; CHECK: if.then: 254; CHECK-NEXT: tail call void @foo() #[[ATTR0]] 255; CHECK-NEXT: ret void 256; CHECK: if.end: 257; CHECK-NEXT: ret void 258; 259 %and = and i32 %a, 134217728 260 %1 = icmp ne i32 %and, 0 261 %2 = icmp slt i32 %a, 0 262 %or.cond = select i1 %1, i1 true, i1 %2 263 br i1 %or.cond, label %if.then, label %if.end 264 265 266if.then: 267 tail call void @foo() nounwind 268 ret void 269 270if.end: 271 ret void 272} 273 274define void @test8(i32 %a) { 275; CHECK-LABEL: @test8( 276; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 277; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0 278; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 279; CHECK: if.then: 280; CHECK-NEXT: tail call void @foo() 281; CHECK-NEXT: ret void 282; CHECK: if.end: 283; CHECK-NEXT: ret void 284; 285 %1 = icmp slt i32 %a, 0 286 %and = and i32 %a, 134217728 287 %2 = icmp ne i32 %and, 0 288 %or.cond = or i1 %1, %2 289 br i1 %or.cond, label %if.then, label %if.end 290 291 292if.then: 293 tail call void @foo() 294 ret void 295 296if.end: 297 ret void 298} 299 300define void @test8_logical(i32 %a) { 301; CHECK-LABEL: @test8_logical( 302; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -2013265920 303; CHECK-NEXT: [[OR_COND_NOT:%.*]] = icmp eq i32 [[TMP1]], 0 304; CHECK-NEXT: br i1 [[OR_COND_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]] 305; CHECK: if.then: 306; CHECK-NEXT: tail call void @foo() 307; CHECK-NEXT: ret void 308; CHECK: if.end: 309; CHECK-NEXT: ret void 310; 311 %1 = icmp slt i32 %a, 0 312 %and = and i32 %a, 134217728 313 %2 = icmp ne i32 %and, 0 314 %or.cond = select i1 %1, i1 true, i1 %2 315 br i1 %or.cond, label %if.then, label %if.end 316 317 318if.then: 319 tail call void @foo() 320 ret void 321 322if.end: 323 ret void 324} 325 326define i1 @test9(i32 %a) { 327; CHECK-LABEL: @test9( 328; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -1073741824 329; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 1073741824 330; CHECK-NEXT: ret i1 [[OR_COND]] 331; 332 %1 = and i32 %a, 1073741824 333 %2 = icmp ne i32 %1, 0 334 %3 = icmp sgt i32 %a, -1 335 %or.cond = and i1 %2, %3 336 ret i1 %or.cond 337} 338 339define i1 @test9_logical(i32 %a) { 340; CHECK-LABEL: @test9_logical( 341; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[A:%.*]], -1073741824 342; CHECK-NEXT: [[OR_COND:%.*]] = icmp eq i32 [[TMP1]], 1073741824 343; CHECK-NEXT: ret i1 [[OR_COND]] 344; 345 %1 = and i32 %a, 1073741824 346 %2 = icmp ne i32 %1, 0 347 %3 = icmp sgt i32 %a, -1 348 %or.cond = select i1 %2, i1 %3, i1 false 349 ret i1 %or.cond 350} 351 352define i1 @test10(i32 %a) { 353; CHECK-LABEL: @test10( 354; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[A:%.*]], 2 355; CHECK-NEXT: ret i1 [[OR_COND]] 356; 357 %1 = and i32 %a, 2 358 %2 = icmp eq i32 %1, 0 359 %3 = icmp ult i32 %a, 4 360 %or.cond = and i1 %2, %3 361 ret i1 %or.cond 362} 363 364define i1 @test10_logical(i32 %a) { 365; CHECK-LABEL: @test10_logical( 366; CHECK-NEXT: [[OR_COND:%.*]] = icmp ult i32 [[A:%.*]], 2 367; CHECK-NEXT: ret i1 [[OR_COND]] 368; 369 %1 = and i32 %a, 2 370 %2 = icmp eq i32 %1, 0 371 %3 = icmp ult i32 %a, 4 372 %or.cond = select i1 %2, i1 %3, i1 false 373 ret i1 %or.cond 374} 375 376define i1 @test11(i32 %a) { 377; CHECK-LABEL: @test11( 378; CHECK-NEXT: [[OR_COND:%.*]] = icmp ugt i32 [[A:%.*]], 1 379; CHECK-NEXT: ret i1 [[OR_COND]] 380; 381 %1 = and i32 %a, 2 382 %2 = icmp ne i32 %1, 0 383 %3 = icmp ugt i32 %a, 3 384 %or.cond = or i1 %2, %3 385 ret i1 %or.cond 386} 387 388define i1 @test11_logical(i32 %a) { 389; CHECK-LABEL: @test11_logical( 390; CHECK-NEXT: [[OR_COND:%.*]] = icmp ugt i32 [[A:%.*]], 1 391; CHECK-NEXT: ret i1 [[OR_COND]] 392; 393 %1 = and i32 %a, 2 394 %2 = icmp ne i32 %1, 0 395 %3 = icmp ugt i32 %a, 3 396 %or.cond = select i1 %2, i1 true, i1 %3 397 ret i1 %or.cond 398} 399