1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s 3 4declare void @sideeffect0() 5declare void @sideeffect1() 6declare void @sideeffect2() 7declare void @use8(i8) 8declare i1 @gen1() 9 10define i1 @t0_or_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 11; CHECK-LABEL: @t0_or_binop( 12; CHECK-NEXT: entry: 13; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 14; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 15; CHECK: pred0: 16; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 17; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 18; CHECK-NEXT: [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]] 19; CHECK-NEXT: br label [[END]] 20; CHECK: end: 21; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 22; CHECK-NEXT: ret i1 [[R]] 23; 24entry: 25 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 26 br i1 %c0, label %pred0, label %pred1 27 28pred0: 29 %c1 = icmp eq i8 %v1, 0 ; canonical predicate 30 %c2 = icmp eq i8 %v2, 0 ; canonical predicate 31 %computed = or i1 %c1, %c2 ; binary or 32 br label %end 33 34pred1: 35 br label %end 36 37end: 38 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 39 ret i1 %r 40} 41define i1 @t1_or_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 42; CHECK-LABEL: @t1_or_logical( 43; CHECK-NEXT: entry: 44; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 45; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 46; CHECK: pred0: 47; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 48; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 49; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]] 50; CHECK-NEXT: br label [[END]] 51; CHECK: end: 52; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 53; CHECK-NEXT: ret i1 [[R]] 54; 55entry: 56 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 57 br i1 %c0, label %pred0, label %pred1 58 59pred0: 60 %c1 = icmp eq i8 %v1, 0 ; canonical predicate 61 %c2 = icmp eq i8 %v2, 0 ; canonical predicate 62 %computed = select i1 %c1, i1 true, i1 %c2 ; logical or 63 br label %end 64 65pred1: 66 br label %end 67 68end: 69 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 70 ret i1 %r 71} 72 73define i1 @t2_and_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 74; CHECK-LABEL: @t2_and_binop( 75; CHECK-NEXT: entry: 76; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 77; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 78; CHECK: pred0: 79; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 80; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 81; CHECK-NEXT: [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]] 82; CHECK-NEXT: br label [[END]] 83; CHECK: end: 84; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 85; CHECK-NEXT: ret i1 [[R]] 86; 87entry: 88 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 89 br i1 %c0, label %pred0, label %pred1 90 91pred0: 92 %c1 = icmp eq i8 %v1, 0 ; canonical predicate 93 %c2 = icmp eq i8 %v2, 0 ; canonical predicate 94 %computed = and i1 %c1, %c2 ; binary and 95 br label %end 96 97pred1: 98 br label %end 99 100end: 101 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 102 ret i1 %r 103} 104define i1 @t3_and_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 105; CHECK-LABEL: @t3_and_logical( 106; CHECK-NEXT: entry: 107; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 108; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 109; CHECK: pred0: 110; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 111; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 112; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false 113; CHECK-NEXT: br label [[END]] 114; CHECK: end: 115; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 116; CHECK-NEXT: ret i1 [[R]] 117; 118entry: 119 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 120 br i1 %c0, label %pred0, label %pred1 121 122pred0: 123 %c1 = icmp eq i8 %v1, 0 ; canonical predicate 124 %c2 = icmp eq i8 %v2, 0 ; canonical predicate 125 %computed = select i1 %c1, i1 %c2, i1 false ; logical and 126 br label %end 127 128pred1: 129 br label %end 130 131end: 132 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 133 ret i1 %r 134} 135 136 137define i1 @t4_nor_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 138; CHECK-LABEL: @t4_nor_binop( 139; CHECK-NEXT: entry: 140; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 141; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 142; CHECK: pred0: 143; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 144; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 145; CHECK-NEXT: [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]] 146; CHECK-NEXT: br label [[END]] 147; CHECK: end: 148; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 149; CHECK-NEXT: ret i1 [[R]] 150; 151entry: 152 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 153 br i1 %c0, label %pred0, label %pred1 154 155pred0: 156 %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 157 %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 158 %computed = and i1 %c1, %c2 ; binary and 159 br label %end 160 161pred1: 162 br label %end 163 164end: 165 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 166 ret i1 %r 167} 168define i1 @t5_nor_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 169; CHECK-LABEL: @t5_nor_logical( 170; CHECK-NEXT: entry: 171; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 172; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 173; CHECK: pred0: 174; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 175; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 176; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false 177; CHECK-NEXT: br label [[END]] 178; CHECK: end: 179; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 180; CHECK-NEXT: ret i1 [[R]] 181; 182entry: 183 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 184 br i1 %c0, label %pred0, label %pred1 185 186pred0: 187 %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 188 %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 189 %computed = select i1 %c1, i1 %c2, i1 false ; logical and 190 br label %end 191 192pred1: 193 br label %end 194 195end: 196 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 197 ret i1 %r 198} 199define i1 @t6_nor_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 200; CHECK-LABEL: @t6_nor_logical2( 201; CHECK-NEXT: entry: 202; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 203; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 204; CHECK: pred0: 205; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 206; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 207; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 false, i1 [[C2]] 208; CHECK-NEXT: br label [[END]] 209; CHECK: end: 210; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 211; CHECK-NEXT: ret i1 [[R]] 212; 213entry: 214 %c0 = icmp eq i8 %v0, 0 215 br i1 %c0, label %pred0, label %pred1 216 217pred0: 218 %c1 = icmp eq i8 %v1, 0 ; canonical predicate 219 %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 220 %computed = select i1 %c1, i1 false, i1 %c2 ; huh, what is this, logical nand? 221 br label %end 222 223pred1: 224 br label %end 225 226end: 227 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 228 ret i1 %r 229} 230 231define i1 @t7_nand_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 232; CHECK-LABEL: @t7_nand_binop( 233; CHECK-NEXT: entry: 234; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 235; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 236; CHECK: pred0: 237; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 238; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 239; CHECK-NEXT: [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]] 240; CHECK-NEXT: br label [[END]] 241; CHECK: end: 242; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 243; CHECK-NEXT: ret i1 [[R]] 244; 245entry: 246 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 247 br i1 %c0, label %pred0, label %pred1 248 249pred0: 250 %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 251 %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 252 %computed = or i1 %c1, %c2 ; binary and 253 br label %end 254 255pred1: 256 br label %end 257 258end: 259 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 260 ret i1 %r 261} 262define i1 @t8_nand_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 263; CHECK-LABEL: @t8_nand_logical( 264; CHECK-NEXT: entry: 265; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 266; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 267; CHECK: pred0: 268; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 269; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 270; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]] 271; CHECK-NEXT: br label [[END]] 272; CHECK: end: 273; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 274; CHECK-NEXT: ret i1 [[R]] 275; 276entry: 277 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 278 br i1 %c0, label %pred0, label %pred1 279 280pred0: 281 %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 282 %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 283 %computed = select i1 %c1, i1 true, i1 %c2 ; logical or 284 br label %end 285 286pred1: 287 br label %end 288 289end: 290 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 291 ret i1 %r 292} 293define i1 @t9_nand_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 294; CHECK-LABEL: @t9_nand_logical2( 295; CHECK-NEXT: entry: 296; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 297; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 298; CHECK: pred0: 299; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 300; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 301; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 true 302; CHECK-NEXT: br label [[END]] 303; CHECK: end: 304; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 305; CHECK-NEXT: ret i1 [[R]] 306; 307entry: 308 %c0 = icmp eq i8 %v0, 0 ; canonical predicate 309 br i1 %c0, label %pred0, label %pred1 310 311pred0: 312 %c1 = icmp eq i8 %v1, 0 ; canonical predicate 313 %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 314 %computed = select i1 %c1, i1 %c2, i1 true ; huh, what is this, logical nor? 315 br label %end 316 317pred1: 318 br label %end 319 320end: 321 %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 322 ret i1 %r 323} 324