1952dc2e5SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2952dc2e5SRoman Lebedev; RUN: opt < %s -S -simplifycfg -simplifycfg-require-and-preserve-domtree=1 | FileCheck %s 3952dc2e5SRoman Lebedev 4952dc2e5SRoman Lebedevdeclare void @sideeffect0() 5952dc2e5SRoman Lebedevdeclare void @sideeffect1() 6952dc2e5SRoman Lebedevdeclare void @sideeffect2() 7952dc2e5SRoman Lebedevdeclare void @use8(i8) 8952dc2e5SRoman Lebedevdeclare i1 @gen1() 9952dc2e5SRoman Lebedev 10952dc2e5SRoman Lebedevdefine i1 @t0_or_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 11952dc2e5SRoman Lebedev; CHECK-LABEL: @t0_or_binop( 12952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 13952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 14952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 15952dc2e5SRoman Lebedev; CHECK: pred0: 16952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 17952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 18952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]] 19952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 20952dc2e5SRoman Lebedev; CHECK: end: 21952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 22952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 23952dc2e5SRoman Lebedev; 24952dc2e5SRoman Lebedeventry: 25952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 26952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 27952dc2e5SRoman Lebedev 28952dc2e5SRoman Lebedevpred0: 29952dc2e5SRoman Lebedev %c1 = icmp eq i8 %v1, 0 ; canonical predicate 30952dc2e5SRoman Lebedev %c2 = icmp eq i8 %v2, 0 ; canonical predicate 31952dc2e5SRoman Lebedev %computed = or i1 %c1, %c2 ; binary or 32952dc2e5SRoman Lebedev br label %end 33952dc2e5SRoman Lebedev 34952dc2e5SRoman Lebedevpred1: 35952dc2e5SRoman Lebedev br label %end 36952dc2e5SRoman Lebedev 37952dc2e5SRoman Lebedevend: 38952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 39952dc2e5SRoman Lebedev ret i1 %r 40952dc2e5SRoman Lebedev} 41952dc2e5SRoman Lebedevdefine i1 @t1_or_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 42952dc2e5SRoman Lebedev; CHECK-LABEL: @t1_or_logical( 43952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 44952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 45952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 46952dc2e5SRoman Lebedev; CHECK: pred0: 47952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 48952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 49952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]] 50952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 51952dc2e5SRoman Lebedev; CHECK: end: 52952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 53952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 54952dc2e5SRoman Lebedev; 55952dc2e5SRoman Lebedeventry: 56952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 57952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 58952dc2e5SRoman Lebedev 59952dc2e5SRoman Lebedevpred0: 60952dc2e5SRoman Lebedev %c1 = icmp eq i8 %v1, 0 ; canonical predicate 61952dc2e5SRoman Lebedev %c2 = icmp eq i8 %v2, 0 ; canonical predicate 62952dc2e5SRoman Lebedev %computed = select i1 %c1, i1 true, i1 %c2 ; logical or 63952dc2e5SRoman Lebedev br label %end 64952dc2e5SRoman Lebedev 65952dc2e5SRoman Lebedevpred1: 66952dc2e5SRoman Lebedev br label %end 67952dc2e5SRoman Lebedev 68952dc2e5SRoman Lebedevend: 69952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 70952dc2e5SRoman Lebedev ret i1 %r 71952dc2e5SRoman Lebedev} 72952dc2e5SRoman Lebedev 73952dc2e5SRoman Lebedevdefine i1 @t2_and_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 74952dc2e5SRoman Lebedev; CHECK-LABEL: @t2_and_binop( 75952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 76952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 77952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 78952dc2e5SRoman Lebedev; CHECK: pred0: 79952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 80952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 81952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]] 82952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 83952dc2e5SRoman Lebedev; CHECK: end: 84952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 85952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 86952dc2e5SRoman Lebedev; 87952dc2e5SRoman Lebedeventry: 88952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 89952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 90952dc2e5SRoman Lebedev 91952dc2e5SRoman Lebedevpred0: 92952dc2e5SRoman Lebedev %c1 = icmp eq i8 %v1, 0 ; canonical predicate 93952dc2e5SRoman Lebedev %c2 = icmp eq i8 %v2, 0 ; canonical predicate 94952dc2e5SRoman Lebedev %computed = and i1 %c1, %c2 ; binary and 95952dc2e5SRoman Lebedev br label %end 96952dc2e5SRoman Lebedev 97952dc2e5SRoman Lebedevpred1: 98952dc2e5SRoman Lebedev br label %end 99952dc2e5SRoman Lebedev 100952dc2e5SRoman Lebedevend: 101952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 102952dc2e5SRoman Lebedev ret i1 %r 103952dc2e5SRoman Lebedev} 104952dc2e5SRoman Lebedevdefine i1 @t3_and_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 105952dc2e5SRoman Lebedev; CHECK-LABEL: @t3_and_logical( 106952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 107952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 108952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 109952dc2e5SRoman Lebedev; CHECK: pred0: 110952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 111952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[V2:%.*]], 0 112952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false 113952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 114952dc2e5SRoman Lebedev; CHECK: end: 115952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 116952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 117952dc2e5SRoman Lebedev; 118952dc2e5SRoman Lebedeventry: 119952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 120952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 121952dc2e5SRoman Lebedev 122952dc2e5SRoman Lebedevpred0: 123952dc2e5SRoman Lebedev %c1 = icmp eq i8 %v1, 0 ; canonical predicate 124952dc2e5SRoman Lebedev %c2 = icmp eq i8 %v2, 0 ; canonical predicate 125952dc2e5SRoman Lebedev %computed = select i1 %c1, i1 %c2, i1 false ; logical and 126952dc2e5SRoman Lebedev br label %end 127952dc2e5SRoman Lebedev 128952dc2e5SRoman Lebedevpred1: 129952dc2e5SRoman Lebedev br label %end 130952dc2e5SRoman Lebedev 131952dc2e5SRoman Lebedevend: 132952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 133952dc2e5SRoman Lebedev ret i1 %r 134952dc2e5SRoman Lebedev} 135952dc2e5SRoman Lebedev 136952dc2e5SRoman Lebedev 137952dc2e5SRoman Lebedevdefine i1 @t4_nor_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 138952dc2e5SRoman Lebedev; CHECK-LABEL: @t4_nor_binop( 139952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 140952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 141952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 142952dc2e5SRoman Lebedev; CHECK: pred0: 143952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 144952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 145952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = and i1 [[C1]], [[C2]] 146952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 147952dc2e5SRoman Lebedev; CHECK: end: 148952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 149952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 150952dc2e5SRoman Lebedev; 151952dc2e5SRoman Lebedeventry: 152952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 153952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 154952dc2e5SRoman Lebedev 155952dc2e5SRoman Lebedevpred0: 156952dc2e5SRoman Lebedev %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 157952dc2e5SRoman Lebedev %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 158952dc2e5SRoman Lebedev %computed = and i1 %c1, %c2 ; binary and 159952dc2e5SRoman Lebedev br label %end 160952dc2e5SRoman Lebedev 161952dc2e5SRoman Lebedevpred1: 162952dc2e5SRoman Lebedev br label %end 163952dc2e5SRoman Lebedev 164952dc2e5SRoman Lebedevend: 165952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 166952dc2e5SRoman Lebedev ret i1 %r 167952dc2e5SRoman Lebedev} 168952dc2e5SRoman Lebedevdefine i1 @t5_nor_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 169952dc2e5SRoman Lebedev; CHECK-LABEL: @t5_nor_logical( 170952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 171952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 172952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 173952dc2e5SRoman Lebedev; CHECK: pred0: 174952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 175952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 176952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 false 177952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 178952dc2e5SRoman Lebedev; CHECK: end: 179952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 180952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 181952dc2e5SRoman Lebedev; 182952dc2e5SRoman Lebedeventry: 183952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 184952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 185952dc2e5SRoman Lebedev 186952dc2e5SRoman Lebedevpred0: 187952dc2e5SRoman Lebedev %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 188952dc2e5SRoman Lebedev %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 189952dc2e5SRoman Lebedev %computed = select i1 %c1, i1 %c2, i1 false ; logical and 190952dc2e5SRoman Lebedev br label %end 191952dc2e5SRoman Lebedev 192952dc2e5SRoman Lebedevpred1: 193952dc2e5SRoman Lebedev br label %end 194952dc2e5SRoman Lebedev 195952dc2e5SRoman Lebedevend: 196952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 197952dc2e5SRoman Lebedev ret i1 %r 198952dc2e5SRoman Lebedev} 199952dc2e5SRoman Lebedevdefine i1 @t6_nor_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 200952dc2e5SRoman Lebedev; CHECK-LABEL: @t6_nor_logical2( 201952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 202952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 203*7ef6f019SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 204*7ef6f019SRoman Lebedev; CHECK: pred0: 205952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 206952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 207952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 false, i1 [[C2]] 208*7ef6f019SRoman Lebedev; CHECK-NEXT: br label [[END]] 209*7ef6f019SRoman Lebedev; CHECK: end: 210*7ef6f019SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 211952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 212952dc2e5SRoman Lebedev; 213952dc2e5SRoman Lebedeventry: 214952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 215952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 216952dc2e5SRoman Lebedev 217952dc2e5SRoman Lebedevpred0: 218952dc2e5SRoman Lebedev %c1 = icmp eq i8 %v1, 0 ; canonical predicate 219952dc2e5SRoman Lebedev %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 220952dc2e5SRoman Lebedev %computed = select i1 %c1, i1 false, i1 %c2 ; huh, what is this, logical nand? 221952dc2e5SRoman Lebedev br label %end 222952dc2e5SRoman Lebedev 223952dc2e5SRoman Lebedevpred1: 224952dc2e5SRoman Lebedev br label %end 225952dc2e5SRoman Lebedev 226952dc2e5SRoman Lebedevend: 227952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 228952dc2e5SRoman Lebedev ret i1 %r 229952dc2e5SRoman Lebedev} 230952dc2e5SRoman Lebedev 231952dc2e5SRoman Lebedevdefine i1 @t7_nand_binop(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 232952dc2e5SRoman Lebedev; CHECK-LABEL: @t7_nand_binop( 233952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 234952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 235952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 236952dc2e5SRoman Lebedev; CHECK: pred0: 237952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 238952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 239952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = or i1 [[C1]], [[C2]] 240952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 241952dc2e5SRoman Lebedev; CHECK: end: 242952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 243952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 244952dc2e5SRoman Lebedev; 245952dc2e5SRoman Lebedeventry: 246952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 247952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 248952dc2e5SRoman Lebedev 249952dc2e5SRoman Lebedevpred0: 250952dc2e5SRoman Lebedev %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 251952dc2e5SRoman Lebedev %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 252952dc2e5SRoman Lebedev %computed = or i1 %c1, %c2 ; binary and 253952dc2e5SRoman Lebedev br label %end 254952dc2e5SRoman Lebedev 255952dc2e5SRoman Lebedevpred1: 256952dc2e5SRoman Lebedev br label %end 257952dc2e5SRoman Lebedev 258952dc2e5SRoman Lebedevend: 259952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 260952dc2e5SRoman Lebedev ret i1 %r 261952dc2e5SRoman Lebedev} 262952dc2e5SRoman Lebedevdefine i1 @t8_nand_logical(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 263952dc2e5SRoman Lebedev; CHECK-LABEL: @t8_nand_logical( 264952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 265952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 266952dc2e5SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 267952dc2e5SRoman Lebedev; CHECK: pred0: 268952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[V1:%.*]], 0 269952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 270952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 true, i1 [[C2]] 271952dc2e5SRoman Lebedev; CHECK-NEXT: br label [[END]] 272952dc2e5SRoman Lebedev; CHECK: end: 273952dc2e5SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 274952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 275952dc2e5SRoman Lebedev; 276952dc2e5SRoman Lebedeventry: 277952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 278952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 279952dc2e5SRoman Lebedev 280952dc2e5SRoman Lebedevpred0: 281952dc2e5SRoman Lebedev %c1 = icmp ne i8 %v1, 0 ; non-canonical predicate 282952dc2e5SRoman Lebedev %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 283952dc2e5SRoman Lebedev %computed = select i1 %c1, i1 true, i1 %c2 ; logical or 284952dc2e5SRoman Lebedev br label %end 285952dc2e5SRoman Lebedev 286952dc2e5SRoman Lebedevpred1: 287952dc2e5SRoman Lebedev br label %end 288952dc2e5SRoman Lebedev 289952dc2e5SRoman Lebedevend: 290952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 291952dc2e5SRoman Lebedev ret i1 %r 292952dc2e5SRoman Lebedev} 293952dc2e5SRoman Lebedevdefine i1 @t9_nand_logical2(i8 %v0, i8 %v1, i8 %v2, i1 %v3) { 294952dc2e5SRoman Lebedev; CHECK-LABEL: @t9_nand_logical2( 295952dc2e5SRoman Lebedev; CHECK-NEXT: entry: 296952dc2e5SRoman Lebedev; CHECK-NEXT: [[C0:%.*]] = icmp eq i8 [[V0:%.*]], 0 297*7ef6f019SRoman Lebedev; CHECK-NEXT: br i1 [[C0]], label [[PRED0:%.*]], label [[END:%.*]] 298*7ef6f019SRoman Lebedev; CHECK: pred0: 299952dc2e5SRoman Lebedev; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[V1:%.*]], 0 300952dc2e5SRoman Lebedev; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[V2:%.*]], 0 301952dc2e5SRoman Lebedev; CHECK-NEXT: [[COMPUTED:%.*]] = select i1 [[C1]], i1 [[C2]], i1 true 302*7ef6f019SRoman Lebedev; CHECK-NEXT: br label [[END]] 303*7ef6f019SRoman Lebedev; CHECK: end: 304*7ef6f019SRoman Lebedev; CHECK-NEXT: [[R:%.*]] = phi i1 [ [[COMPUTED]], [[PRED0]] ], [ [[V3:%.*]], [[ENTRY:%.*]] ] 305952dc2e5SRoman Lebedev; CHECK-NEXT: ret i1 [[R]] 306952dc2e5SRoman Lebedev; 307952dc2e5SRoman Lebedeventry: 308952dc2e5SRoman Lebedev %c0 = icmp eq i8 %v0, 0 ; canonical predicate 309952dc2e5SRoman Lebedev br i1 %c0, label %pred0, label %pred1 310952dc2e5SRoman Lebedev 311952dc2e5SRoman Lebedevpred0: 312952dc2e5SRoman Lebedev %c1 = icmp eq i8 %v1, 0 ; canonical predicate 313952dc2e5SRoman Lebedev %c2 = icmp ne i8 %v2, 0 ; non-canonical predicate 314952dc2e5SRoman Lebedev %computed = select i1 %c1, i1 %c2, i1 true ; huh, what is this, logical nor? 315952dc2e5SRoman Lebedev br label %end 316952dc2e5SRoman Lebedev 317952dc2e5SRoman Lebedevpred1: 318952dc2e5SRoman Lebedev br label %end 319952dc2e5SRoman Lebedev 320952dc2e5SRoman Lebedevend: 321952dc2e5SRoman Lebedev %r = phi i1 [ %computed, %pred0 ], [ %v3, %pred1 ] 322952dc2e5SRoman Lebedev ret i1 %r 323952dc2e5SRoman Lebedev} 324