1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instcombine -S < %s | FileCheck %s 3 4declare void @use(i1) 5 6define i1 @logic_and_logic_or_1(i1 %c, i1 %a, i1 %b) { 7; CHECK-LABEL: @logic_and_logic_or_1( 8; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 9; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 10; CHECK-NEXT: ret i1 [[OR]] 11; 12 %ac = select i1 %c, i1 %a, i1 false 13 %bc = select i1 %c, i1 %b, i1 false 14 %or = select i1 %ac, i1 true, i1 %bc 15 ret i1 %or 16} 17 18define i1 @logic_and_logic_or_2(i1 %c, i1 %a, i1 %b) { 19; CHECK-LABEL: @logic_and_logic_or_2( 20; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 21; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 22; CHECK-NEXT: ret i1 [[OR]] 23; 24 %ac = select i1 %a, i1 %c, i1 false 25 %bc = select i1 %c, i1 %b, i1 false 26 %or = select i1 %ac, i1 true, i1 %bc 27 ret i1 %or 28} 29 30define i1 @logic_and_logic_or_3(i1 %c, i1 %a, i1 %b) { 31; CHECK-LABEL: @logic_and_logic_or_3( 32; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 33; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 [[C:%.*]], i1 false 34; CHECK-NEXT: ret i1 [[OR]] 35; 36 %ac = select i1 %a, i1 %c, i1 false 37 %bc = select i1 %b, i1 %c, i1 false 38 %or = select i1 %ac, i1 true, i1 %bc 39 ret i1 %or 40} 41 42define i1 @logic_and_logic_or_4(i1 %c, i1 %a, i1 %b) { 43; CHECK-LABEL: @logic_and_logic_or_4( 44; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 45; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 46; CHECK-NEXT: ret i1 [[OR]] 47; 48 %ac = select i1 %c, i1 %a, i1 false 49 %bc = select i1 %b, i1 %c, i1 false 50 %or = select i1 %ac, i1 true, i1 %bc 51 ret i1 %or 52} 53 54define i1 @logic_and_logic_or_5(i1 %c, i1 %a, i1 %b) { 55; CHECK-LABEL: @logic_and_logic_or_5( 56; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 57; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 58; CHECK-NEXT: ret i1 [[OR]] 59; 60 %ac = select i1 %c, i1 %a, i1 false 61 %bc = select i1 %c, i1 %b, i1 false 62 %or = select i1 %bc, i1 true, i1 %ac 63 ret i1 %or 64} 65 66define i1 @logic_and_logic_or_6(i1 %c, i1 %a, i1 %b) { 67; CHECK-LABEL: @logic_and_logic_or_6( 68; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 69; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 70; CHECK-NEXT: ret i1 [[OR]] 71; 72 %ac = select i1 %a, i1 %c, i1 false 73 %bc = select i1 %c, i1 %b, i1 false 74 %or = select i1 %bc, i1 true, i1 %ac 75 ret i1 %or 76} 77 78define i1 @logic_and_logic_or_7(i1 %c, i1 %a, i1 %b) { 79; CHECK-LABEL: @logic_and_logic_or_7( 80; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 81; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 [[C:%.*]], i1 false 82; CHECK-NEXT: ret i1 [[OR]] 83; 84 %ac = select i1 %a, i1 %c, i1 false 85 %bc = select i1 %b, i1 %c, i1 false 86 %or = select i1 %bc, i1 true, i1 %ac 87 ret i1 %or 88} 89 90define i1 @logic_and_logic_or_8(i1 %c, i1 %a, i1 %b) { 91; CHECK-LABEL: @logic_and_logic_or_8( 92; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 93; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 94; CHECK-NEXT: ret i1 [[OR]] 95; 96 %ac = select i1 %c, i1 %a, i1 false 97 %bc = select i1 %b, i1 %c, i1 false 98 %or = select i1 %bc, i1 true, i1 %ac 99 ret i1 %or 100} 101 102define <3 x i1> @logic_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 103; CHECK-LABEL: @logic_and_logic_or_vector( 104; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 105; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer 106; CHECK-NEXT: ret <3 x i1> [[OR]] 107; 108 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false> 109 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false> 110 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc 111 ret <3 x i1> %or 112} 113 114define <3 x i1> @logic_and_logic_or_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 115; CHECK-LABEL: @logic_and_logic_or_vector_poison1( 116; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 117; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer 118; CHECK-NEXT: ret <3 x i1> [[OR]] 119; 120 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false> 121 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false> 122 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 poison>, <3 x i1> %bc 123 ret <3 x i1> %or 124} 125 126define <3 x i1> @logic_and_logic_or_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 127; CHECK-LABEL: @logic_and_logic_or_vector_poison2( 128; CHECK-NEXT: [[AC:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[A:%.*]], <3 x i1> <i1 false, i1 poison, i1 false> 129; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[C]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 130; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[AC]], <3 x i1> splat (i1 true), <3 x i1> [[BC]] 131; CHECK-NEXT: ret <3 x i1> [[OR]] 132; 133 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 poison, i1 false> 134 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false> 135 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc 136 ret <3 x i1> %or 137} 138 139define <3 x i1> @logic_and_logic_or_vector_poison3(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 140; CHECK-LABEL: @logic_and_logic_or_vector_poison3( 141; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 142; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[BC]], <3 x i1> <i1 poison, i1 false, i1 false> 143; CHECK-NEXT: ret <3 x i1> [[OR]] 144; 145 %ac = select <3 x i1> %c, <3 x i1> %a, <3 x i1> <i1 false, i1 false, i1 false> 146 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 poison, i1 false, i1 false> 147 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc 148 ret <3 x i1> %or 149} 150 151; negative test: not one use for both op 152 153define i1 @logic_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) { 154; CHECK-LABEL: @logic_and_logic_or_not_one_use( 155; CHECK-NEXT: [[AC:%.*]] = select i1 [[C:%.*]], i1 [[A:%.*]], i1 false 156; CHECK-NEXT: [[BC:%.*]] = select i1 [[C]], i1 [[B:%.*]], i1 false 157; CHECK-NEXT: [[OR:%.*]] = select i1 [[AC]], i1 true, i1 [[BC]] 158; CHECK-NEXT: call void @use(i1 [[AC]]) 159; CHECK-NEXT: call void @use(i1 [[BC]]) 160; CHECK-NEXT: ret i1 [[OR]] 161; 162 %ac = select i1 %c, i1 %a, i1 false 163 %bc = select i1 %c, i1 %b, i1 false 164 %or = select i1 %ac, i1 true, i1 %bc 165 call void @use(i1 %ac) 166 call void @use(i1 %bc) 167 ret i1 %or 168} 169 170define i1 @and_logic_and_logic_or_1(i1 %c, i1 %a, i1 %b) { 171; CHECK-LABEL: @and_logic_and_logic_or_1( 172; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 173; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 174; CHECK-NEXT: ret i1 [[OR]] 175; 176 %ac = and i1 %c, %a 177 %bc = select i1 %c, i1 %b, i1 false 178 %or = select i1 %ac, i1 true, i1 %bc 179 ret i1 %or 180} 181 182define i1 @and_logic_and_logic_or_2(i1 %c, i1 %a, i1 %b) { 183; CHECK-LABEL: @and_logic_and_logic_or_2( 184; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 185; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 186; CHECK-NEXT: ret i1 [[OR]] 187; 188 %ac = and i1 %c, %a 189 %bc = select i1 %b, i1 %c, i1 false 190 %or = select i1 %ac, i1 true, i1 %bc 191 ret i1 %or 192} 193 194define i1 @and_logic_and_logic_or_3(i1 %c, i1 %a, i1 %b) { 195; CHECK-LABEL: @and_logic_and_logic_or_3( 196; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 197; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 198; CHECK-NEXT: ret i1 [[OR]] 199; 200 %ac = and i1 %a, %c 201 %bc = select i1 %c, i1 %b, i1 false 202 %or = select i1 %ac, i1 true, i1 %bc 203 ret i1 %or 204} 205 206define i1 @and_logic_and_logic_or_4(i1 %c, i1 %a, i1 %b) { 207; CHECK-LABEL: @and_logic_and_logic_or_4( 208; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 209; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 210; CHECK-NEXT: ret i1 [[OR]] 211; 212 %ac = and i1 %a, %c 213 %bc = select i1 %b, i1 %c, i1 false 214 %or = select i1 %ac, i1 true, i1 %bc 215 ret i1 %or 216} 217 218define i1 @and_logic_and_logic_or_5(i1 %c, i1 %a, i1 %b) { 219; CHECK-LABEL: @and_logic_and_logic_or_5( 220; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 221; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 222; CHECK-NEXT: ret i1 [[OR]] 223; 224 %ac = and i1 %c, %a 225 %bc = select i1 %c, i1 %b, i1 false 226 %or = select i1 %bc, i1 true, i1 %ac 227 ret i1 %or 228} 229 230define i1 @and_logic_and_logic_or_6(i1 %c, i1 %a, i1 %b) { 231; CHECK-LABEL: @and_logic_and_logic_or_6( 232; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 233; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]] 234; CHECK-NEXT: ret i1 [[OR]] 235; 236 %ac = and i1 %c, %a 237 %bc = select i1 %b, i1 %c, i1 false 238 %or = select i1 %bc, i1 true, i1 %ac 239 ret i1 %or 240} 241 242define i1 @and_logic_and_logic_or_7(i1 %c, i1 %a, i1 %b) { 243; CHECK-LABEL: @and_logic_and_logic_or_7( 244; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 245; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 [[TMP1]], i1 false 246; CHECK-NEXT: ret i1 [[OR]] 247; 248 %ac = and i1 %a, %c 249 %bc = select i1 %c, i1 %b, i1 false 250 %or = select i1 %bc, i1 true, i1 %ac 251 ret i1 %or 252} 253 254define i1 @and_logic_and_logic_or_8(i1 %c, i1 %a, i1 %b) { 255; CHECK-LABEL: @and_logic_and_logic_or_8( 256; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 257; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]] 258; CHECK-NEXT: ret i1 [[OR]] 259; 260 %ac = and i1 %a, %c 261 %bc = select i1 %b, i1 %c, i1 false 262 %or = select i1 %bc, i1 true, i1 %ac 263 ret i1 %or 264} 265 266define <3 x i1> @and_logic_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 267; CHECK-LABEL: @and_logic_and_logic_or_vector( 268; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 269; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer 270; CHECK-NEXT: ret <3 x i1> [[OR]] 271; 272 %ac = and <3 x i1> %c, %a 273 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false> 274 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc 275 ret <3 x i1> %or 276} 277 278define <3 x i1> @and_logic_and_logic_or_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 279; CHECK-LABEL: @and_logic_and_logic_or_vector_poison1( 280; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 281; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[BC]], <3 x i1> <i1 false, i1 poison, i1 false> 282; CHECK-NEXT: ret <3 x i1> [[OR]] 283; 284 %ac = and <3 x i1> %c, %a 285 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 poison, i1 false> 286 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc 287 ret <3 x i1> %or 288} 289 290define <3 x i1> @and_logic_and_logic_or_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 291; CHECK-LABEL: @and_logic_and_logic_or_vector_poison2( 292; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 293; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[TMP1]], <3 x i1> zeroinitializer 294; CHECK-NEXT: ret <3 x i1> [[OR]] 295; 296 %ac = and <3 x i1> %c, %a 297 %bc = select <3 x i1> %c, <3 x i1> %b, <3 x i1> <i1 false, i1 false, i1 false> 298 %or = select <3 x i1> %ac, <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> %bc 299 ret <3 x i1> %or 300} 301 302define i1 @and_logic_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) { 303; CHECK-LABEL: @and_logic_and_logic_or_not_one_use( 304; CHECK-NEXT: [[AC:%.*]] = and i1 [[A:%.*]], [[C:%.*]] 305; CHECK-NEXT: [[BC:%.*]] = select i1 [[B:%.*]], i1 [[C]], i1 false 306; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[C]], i1 [[AC]] 307; CHECK-NEXT: call void @use(i1 [[AC]]) 308; CHECK-NEXT: call void @use(i1 [[BC]]) 309; CHECK-NEXT: ret i1 [[OR]] 310; 311 %ac = and i1 %a, %c 312 %bc = select i1 %b, i1 %c, i1 false 313 %or = select i1 %bc, i1 true, i1 %ac 314 call void @use(i1 %ac) 315 call void @use(i1 %bc) 316 ret i1 %or 317} 318 319define i1 @and_and_logic_or_1(i1 %c, i1 %a, i1 %b) { 320; CHECK-LABEL: @and_and_logic_or_1( 321; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 true, i1 [[B:%.*]] 322; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]] 323; CHECK-NEXT: ret i1 [[OR]] 324; 325 %ac = and i1 %c, %a 326 %bc = and i1 %c, %b 327 %or = select i1 %ac, i1 true, i1 %bc 328 ret i1 %or 329} 330 331define i1 @and_and_logic_or_2(i1 %c, i1 %a, i1 %b) { 332; CHECK-LABEL: @and_and_logic_or_2( 333; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[A:%.*]] 334; CHECK-NEXT: [[OR:%.*]] = and i1 [[C:%.*]], [[TMP1]] 335; CHECK-NEXT: ret i1 [[OR]] 336; 337 %ac = and i1 %a, %c 338 %bc = and i1 %c, %b 339 %or = select i1 %bc, i1 true, i1 %ac 340 ret i1 %or 341} 342 343define <3 x i1> @and_and_logic_or_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 344; CHECK-LABEL: @and_and_logic_or_vector( 345; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 346; CHECK-NEXT: [[OR:%.*]] = and <3 x i1> [[C:%.*]], [[TMP1]] 347; CHECK-NEXT: ret <3 x i1> [[OR]] 348; 349 %ac = and <3 x i1> %c, %a 350 %bc = and <3 x i1> %c, %b 351 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %bc 352 ret <3 x i1> %or 353} 354 355define <3 x i1> @and_and_logic_or_vector_poison(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 356; CHECK-LABEL: @and_and_logic_or_vector_poison( 357; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 358; CHECK-NEXT: [[OR:%.*]] = and <3 x i1> [[C:%.*]], [[TMP1]] 359; CHECK-NEXT: ret <3 x i1> [[OR]] 360; 361 %ac = and <3 x i1> %c, %a 362 %bc = and <3 x i1> %c, %b 363 %or = select <3 x i1> %ac, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %bc 364 ret <3 x i1> %or 365} 366 367define i1 @and_and_logic_or_not_one_use(i1 %c, i1 %a, i1 %b) { 368; CHECK-LABEL: @and_and_logic_or_not_one_use( 369; CHECK-NEXT: [[AC:%.*]] = and i1 [[A:%.*]], [[C:%.*]] 370; CHECK-NEXT: [[BC:%.*]] = and i1 [[C]], [[B:%.*]] 371; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[C]], i1 [[AC]] 372; CHECK-NEXT: call void @use(i1 [[AC]]) 373; CHECK-NEXT: call void @use(i1 [[BC]]) 374; CHECK-NEXT: ret i1 [[OR]] 375; 376 %ac = and i1 %a, %c 377 %bc = and i1 %c, %b 378 %or = select i1 %bc, i1 true, i1 %ac 379 call void @use(i1 %ac) 380 call void @use(i1 %bc) 381 ret i1 %or 382} 383 384define i1 @logic_or_logic_and_1(i1 %c, i1 %a, i1 %b) { 385; CHECK-LABEL: @logic_or_logic_and_1( 386; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 387; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 388; CHECK-NEXT: ret i1 [[OR]] 389; 390 %ac = select i1 %c, i1 true, i1 %a 391 %bc = select i1 %c, i1 true, i1 %b 392 %or = select i1 %ac, i1 %bc, i1 false 393 ret i1 %or 394} 395 396define i1 @logic_or_logic_and_2(i1 %c, i1 %a, i1 %b) { 397; CHECK-LABEL: @logic_or_logic_and_2( 398; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 399; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 400; CHECK-NEXT: ret i1 [[OR]] 401; 402 %ac = select i1 %a, i1 true, i1 %c 403 %bc = select i1 %c, i1 true, i1 %b 404 %or = select i1 %ac, i1 %bc, i1 false 405 ret i1 %or 406} 407 408define i1 @logic_or_logic_and_3(i1 %c, i1 %a, i1 %b) { 409; CHECK-LABEL: @logic_or_logic_and_3( 410; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 411; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 true, i1 [[C:%.*]] 412; CHECK-NEXT: ret i1 [[OR]] 413; 414 %ac = select i1 %a, i1 true, i1 %c 415 %bc = select i1 %b, i1 true, i1 %c 416 %or = select i1 %ac, i1 %bc, i1 false 417 ret i1 %or 418} 419 420define i1 @logic_or_logic_and_4(i1 %c, i1 %a, i1 %b) { 421; CHECK-LABEL: @logic_or_logic_and_4( 422; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 423; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 424; CHECK-NEXT: ret i1 [[OR]] 425; 426 %ac = select i1 %c, i1 true, i1 %a 427 %bc = select i1 %b, i1 true, i1 %c 428 %or = select i1 %ac, i1 %bc, i1 false 429 ret i1 %or 430} 431 432define i1 @logic_or_logic_and_5(i1 %c, i1 %a, i1 %b) { 433; CHECK-LABEL: @logic_or_logic_and_5( 434; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 435; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 436; CHECK-NEXT: ret i1 [[OR]] 437; 438 %ac = select i1 %c, i1 true, i1 %a 439 %bc = select i1 %c, i1 true, i1 %b 440 %or = select i1 %bc, i1 %ac, i1 false 441 ret i1 %or 442} 443 444define i1 @logic_or_logic_and_6(i1 %c, i1 %a, i1 %b) { 445; CHECK-LABEL: @logic_or_logic_and_6( 446; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 447; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 448; CHECK-NEXT: ret i1 [[OR]] 449; 450 %ac = select i1 %a, i1 true, i1 %c 451 %bc = select i1 %c, i1 true, i1 %b 452 %or = select i1 %bc, i1 %ac, i1 false 453 ret i1 %or 454} 455 456define i1 @logic_or_logic_and_7(i1 %c, i1 %a, i1 %b) { 457; CHECK-LABEL: @logic_or_logic_and_7( 458; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 459; CHECK-NEXT: [[OR:%.*]] = select i1 [[TMP1]], i1 true, i1 [[C:%.*]] 460; CHECK-NEXT: ret i1 [[OR]] 461; 462 %ac = select i1 %a, i1 true, i1 %c 463 %bc = select i1 %b, i1 true, i1 %c 464 %or = select i1 %bc, i1 %ac, i1 false 465 ret i1 %or 466} 467 468define i1 @logic_or_logic_and_8(i1 %c, i1 %a, i1 %b) { 469; CHECK-LABEL: @logic_or_logic_and_8( 470; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 471; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 472; CHECK-NEXT: ret i1 [[OR]] 473; 474 %ac = select i1 %c, i1 true, i1 %a 475 %bc = select i1 %b, i1 true, i1 %c 476 %or = select i1 %bc, i1 %ac, i1 false 477 ret i1 %or 478} 479 480define <3 x i1> @logic_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 481; CHECK-LABEL: @logic_or_logic_and_vector( 482; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 483; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]] 484; CHECK-NEXT: ret <3 x i1> [[OR]] 485; 486 %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a 487 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b 488 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false> 489 ret <3 x i1> %or 490} 491 492define <3 x i1> @logic_or_logic_and_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 493; CHECK-LABEL: @logic_or_logic_and_vector_poison1( 494; CHECK-NEXT: [[AC:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> [[A:%.*]] 495; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[C]], <3 x i1> splat (i1 true), <3 x i1> [[B:%.*]] 496; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[AC]], <3 x i1> [[BC]], <3 x i1> zeroinitializer 497; CHECK-NEXT: ret <3 x i1> [[OR]] 498; 499 %ac = select <3 x i1> %c, <3 x i1> <i1 poison, i1 true, i1 true>, <3 x i1> %a 500 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b 501 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false> 502 ret <3 x i1> %or 503} 504 505define <3 x i1> @logic_or_logic_and_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 506; CHECK-LABEL: @logic_or_logic_and_vector_poison2( 507; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 508; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> [[BC]] 509; CHECK-NEXT: ret <3 x i1> [[OR]] 510; 511 %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a 512 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %b 513 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false> 514 ret <3 x i1> %or 515} 516 517define <3 x i1> @logic_or_logic_and_vector_poison3(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 518; CHECK-LABEL: @logic_or_logic_and_vector_poison3( 519; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 520; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]] 521; CHECK-NEXT: ret <3 x i1> [[OR]] 522; 523 %ac = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %a 524 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b 525 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 poison> 526 ret <3 x i1> %or 527} 528 529; negative test: not one use for both op 530 531define i1 @logic_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) { 532; CHECK-LABEL: @logic_or_logic_and_not_one_use( 533; CHECK-NEXT: [[AC:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[A:%.*]] 534; CHECK-NEXT: [[BC:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[C]] 535; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]] 536; CHECK-NEXT: call void @use(i1 [[AC]]) 537; CHECK-NEXT: call void @use(i1 [[BC]]) 538; CHECK-NEXT: ret i1 [[OR]] 539; 540 %ac = select i1 %c, i1 true, i1 %a 541 %bc = select i1 %b, i1 true, i1 %c 542 %or = select i1 %bc, i1 %ac, i1 false 543 call void @use(i1 %ac) 544 call void @use(i1 %bc) 545 ret i1 %or 546} 547 548define i1 @or_logic_or_logic_and_1(i1 %c, i1 %a, i1 %b) { 549; CHECK-LABEL: @or_logic_or_logic_and_1( 550; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 551; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 552; CHECK-NEXT: ret i1 [[OR]] 553; 554 %ac = or i1 %c, %a 555 %bc = select i1 %c, i1 true, i1 %b 556 %or = select i1 %ac, i1 %bc, i1 false 557 ret i1 %or 558} 559 560define i1 @or_logic_or_logic_and_2(i1 %c, i1 %a, i1 %b) { 561; CHECK-LABEL: @or_logic_or_logic_and_2( 562; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 563; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 564; CHECK-NEXT: ret i1 [[OR]] 565; 566 %ac = or i1 %c, %a 567 %bc = select i1 %b, i1 true, i1 %c 568 %or = select i1 %ac, i1 %bc, i1 false 569 ret i1 %or 570} 571 572define i1 @or_logic_or_logic_and_3(i1 %c, i1 %a, i1 %b) { 573; CHECK-LABEL: @or_logic_or_logic_and_3( 574; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 575; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 576; CHECK-NEXT: ret i1 [[OR]] 577; 578 %ac = or i1 %c, %a 579 %bc = select i1 %c, i1 true, i1 %b 580 %or = select i1 %bc, i1 %ac, i1 false 581 ret i1 %or 582} 583 584define i1 @or_logic_or_logic_and_4(i1 %c, i1 %a, i1 %b) { 585; CHECK-LABEL: @or_logic_or_logic_and_4( 586; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 587; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]] 588; CHECK-NEXT: ret i1 [[OR]] 589; 590 %ac = or i1 %c, %a 591 %bc = select i1 %b, i1 true, i1 %c 592 %or = select i1 %bc, i1 %ac, i1 false 593 ret i1 %or 594} 595 596define i1 @or_logic_or_logic_and_5(i1 %c, i1 %a, i1 %b) { 597; CHECK-LABEL: @or_logic_or_logic_and_5( 598; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 599; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 600; CHECK-NEXT: ret i1 [[OR]] 601; 602 %ac = or i1 %a, %c 603 %bc = select i1 %c, i1 true, i1 %b 604 %or = select i1 %ac, i1 %bc, i1 false 605 ret i1 %or 606} 607 608define i1 @or_logic_or_logic_and_6(i1 %c, i1 %a, i1 %b) { 609; CHECK-LABEL: @or_logic_or_logic_and_6( 610; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 611; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 612; CHECK-NEXT: ret i1 [[OR]] 613; 614 %ac = or i1 %a, %c 615 %bc = select i1 %b, i1 true, i1 %c 616 %or = select i1 %ac, i1 %bc, i1 false 617 ret i1 %or 618} 619 620define i1 @or_logic_or_logic_and_7(i1 %c, i1 %a, i1 %b) { 621; CHECK-LABEL: @or_logic_or_logic_and_7( 622; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 623; CHECK-NEXT: [[OR:%.*]] = select i1 [[C:%.*]], i1 true, i1 [[TMP1]] 624; CHECK-NEXT: ret i1 [[OR]] 625; 626 %ac = or i1 %a, %c 627 %bc = select i1 %c, i1 true, i1 %b 628 %or = select i1 %bc, i1 %ac, i1 false 629 ret i1 %or 630} 631 632define i1 @or_logic_or_logic_and_8(i1 %c, i1 %a, i1 %b) { 633; CHECK-LABEL: @or_logic_or_logic_and_8( 634; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 635; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]] 636; CHECK-NEXT: ret i1 [[OR]] 637; 638 %ac = or i1 %a, %c 639 %bc = select i1 %b, i1 true, i1 %c 640 %or = select i1 %bc, i1 %ac, i1 false 641 ret i1 %or 642} 643 644define <3 x i1> @or_logic_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 645; CHECK-LABEL: @or_logic_or_logic_and_vector( 646; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 647; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]] 648; CHECK-NEXT: ret <3 x i1> [[OR]] 649; 650 %ac = or <3 x i1> %c, %a 651 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b 652 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false> 653 ret <3 x i1> %or 654} 655 656define <3 x i1> @or_logic_or_logic_and_vector_poison1(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 657; CHECK-LABEL: @or_logic_or_logic_and_vector_poison1( 658; CHECK-NEXT: [[BC:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 659; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> [[BC]] 660; CHECK-NEXT: ret <3 x i1> [[OR]] 661; 662 %ac = or <3 x i1> %c, %a 663 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 poison, i1 true>, <3 x i1> %b 664 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false> 665 ret <3 x i1> %or 666} 667 668define <3 x i1> @or_logic_or_logic_and_vector_poison2(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 669; CHECK-LABEL: @or_logic_or_logic_and_vector_poison2( 670; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 671; CHECK-NEXT: [[OR:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> splat (i1 true), <3 x i1> [[TMP1]] 672; CHECK-NEXT: ret <3 x i1> [[OR]] 673; 674 %ac = or <3 x i1> %c, %a 675 %bc = select <3 x i1> %c, <3 x i1> <i1 true, i1 true, i1 true>, <3 x i1> %b 676 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 poison> 677 ret <3 x i1> %or 678} 679 680define i1 @or_logic_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) { 681; CHECK-LABEL: @or_logic_or_logic_and_not_one_use( 682; CHECK-NEXT: [[AC:%.*]] = or i1 [[C:%.*]], [[A:%.*]] 683; CHECK-NEXT: [[BC:%.*]] = select i1 [[B:%.*]], i1 true, i1 [[C]] 684; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]] 685; CHECK-NEXT: call void @use(i1 [[AC]]) 686; CHECK-NEXT: call void @use(i1 [[BC]]) 687; CHECK-NEXT: ret i1 [[OR]] 688; 689 %ac = or i1 %c, %a 690 %bc = select i1 %b, i1 true, i1 %c 691 %or = select i1 %bc, i1 %ac, i1 false 692 call void @use(i1 %ac) 693 call void @use(i1 %bc) 694 ret i1 %or 695} 696 697define i1 @or_or_logic_and_1(i1 %c, i1 %a, i1 %b) { 698; CHECK-LABEL: @or_or_logic_and_1( 699; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false 700; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]] 701; CHECK-NEXT: ret i1 [[OR]] 702; 703 %ac = or i1 %c, %a 704 %bc = or i1 %b, %c 705 %or = select i1 %ac, i1 %bc, i1 false 706 ret i1 %or 707} 708 709define i1 @or_or_logic_and_2(i1 %c, i1 %a, i1 %b) { 710; CHECK-LABEL: @or_or_logic_and_2( 711; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[B:%.*]], i1 [[A:%.*]], i1 false 712; CHECK-NEXT: [[OR:%.*]] = or i1 [[C:%.*]], [[TMP1]] 713; CHECK-NEXT: ret i1 [[OR]] 714; 715 %ac = or i1 %c, %a 716 %bc = or i1 %b, %c 717 %or = select i1 %bc, i1 %ac, i1 false 718 ret i1 %or 719} 720 721define <3 x i1> @or_or_logic_and_vector(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 722; CHECK-LABEL: @or_or_logic_and_vector( 723; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 724; CHECK-NEXT: [[OR:%.*]] = or <3 x i1> [[C:%.*]], [[TMP1]] 725; CHECK-NEXT: ret <3 x i1> [[OR]] 726; 727 %ac = or <3 x i1> %c, %a 728 %bc = or <3 x i1> %b, %c 729 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 false, i1 false, i1 false> 730 ret <3 x i1> %or 731} 732 733define <3 x i1> @or_or_logic_and_vector_poison(<3 x i1> %c, <3 x i1> %a, <3 x i1> %b) { 734; CHECK-LABEL: @or_or_logic_and_vector_poison( 735; CHECK-NEXT: [[TMP1:%.*]] = select <3 x i1> [[A:%.*]], <3 x i1> [[B:%.*]], <3 x i1> zeroinitializer 736; CHECK-NEXT: [[OR:%.*]] = or <3 x i1> [[C:%.*]], [[TMP1]] 737; CHECK-NEXT: ret <3 x i1> [[OR]] 738; 739 %ac = or <3 x i1> %c, %a 740 %bc = or <3 x i1> %b, %c 741 %or = select <3 x i1> %ac, <3 x i1> %bc, <3 x i1> <i1 poison, i1 false, i1 false> 742 ret <3 x i1> %or 743} 744 745define i1 @or_or_logic_and_not_one_use(i1 %c, i1 %a, i1 %b) { 746; CHECK-LABEL: @or_or_logic_and_not_one_use( 747; CHECK-NEXT: [[AC:%.*]] = or i1 [[C:%.*]], [[A:%.*]] 748; CHECK-NEXT: [[BC:%.*]] = or i1 [[B:%.*]], [[C]] 749; CHECK-NEXT: [[OR:%.*]] = select i1 [[B]], i1 [[AC]], i1 [[C]] 750; CHECK-NEXT: call void @use(i1 [[AC]]) 751; CHECK-NEXT: call void @use(i1 [[BC]]) 752; CHECK-NEXT: ret i1 [[OR]] 753; 754 %ac = or i1 %c, %a 755 %bc = or i1 %b, %c 756 %or = select i1 %bc, i1 %ac, i1 false 757 call void @use(i1 %ac) 758 call void @use(i1 %bc) 759 ret i1 %or 760} 761