1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instsimplify < %s -S | FileCheck %s 3 4define i1 @phi_ugt_non_zero(i8 %x) { 5; CHECK-LABEL: @phi_ugt_non_zero( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 32 8; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 9; CHECK: T: 10; CHECK-NEXT: ret i1 false 11; CHECK: F: 12; CHECK-NEXT: br label [[T]] 13; 14entry: 15 %cmp = icmp ugt i8 %x, 32 16 br i1 %cmp, label %T, label %F 17T: 18 %v = phi i8 [ %x, %entry], [-1, %F] 19 %r = icmp eq i8 %v, 0 20 ret i1 %r 21F: 22 br label %T 23} 24 25define i1 @phi_uge_non_zero(i8 %x) { 26; CHECK-LABEL: @phi_uge_non_zero( 27; CHECK-NEXT: entry: 28; CHECK-NEXT: [[CMP:%.*]] = icmp uge i8 [[X:%.*]], 32 29; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 30; CHECK: T: 31; CHECK-NEXT: ret i1 false 32; CHECK: F: 33; CHECK-NEXT: br label [[T]] 34; 35entry: 36 %cmp = icmp uge i8 %x, 32 37 br i1 %cmp, label %T, label %F 38T: 39 %v = phi i8 [ %x, %entry], [-1, %F] 40 %r = icmp eq i8 %v, 0 41 ret i1 %r 42F: 43 br label %T 44} 45 46define i1 @phi_ugt_non_zero_fail(i8 %x) { 47; CHECK-LABEL: @phi_ugt_non_zero_fail( 48; CHECK-NEXT: entry: 49; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i8 [[X:%.*]], 32 50; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 51; CHECK: T: 52; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ 0, [[F]] ] 53; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0 54; CHECK-NEXT: ret i1 [[R]] 55; CHECK: F: 56; CHECK-NEXT: br label [[T]] 57; 58entry: 59 %cmp = icmp ugt i8 %x, 32 60 br i1 %cmp, label %T, label %F 61T: 62 %v = phi i8 [ %x, %entry], [0, %F] 63 %r = icmp eq i8 %v, 0 64 ret i1 %r 65F: 66 br label %T 67} 68 69define i1 @phi_ult_non_zero(i8 %x) { 70; CHECK-LABEL: @phi_ult_non_zero( 71; CHECK-NEXT: entry: 72; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], 123 73; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 74; CHECK: T: 75; CHECK-NEXT: br label [[F]] 76; CHECK: F: 77; CHECK-NEXT: ret i1 false 78; 79entry: 80 %cmp = icmp ult i8 %x, 123 81 br i1 %cmp, label %T, label %F 82T: 83 br label %F 84F: 85 %v = phi i8 [ %x, %entry], [-1, %T] 86 %r = icmp eq i8 %v, 0 87 ret i1 %r 88} 89 90define i1 @phi_ule_non_zero(i8 %x) { 91; CHECK-LABEL: @phi_ule_non_zero( 92; CHECK-NEXT: entry: 93; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[X:%.*]], 123 94; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 95; CHECK: T: 96; CHECK-NEXT: br label [[F]] 97; CHECK: F: 98; CHECK-NEXT: ret i1 false 99; 100entry: 101 %cmp = icmp ule i8 %x, 123 102 br i1 %cmp, label %T, label %F 103T: 104 br label %F 105F: 106 %v = phi i8 [ %x, %entry], [-1, %T] 107 %r = icmp eq i8 %v, 0 108 ret i1 %r 109} 110 111define i1 @phi_ule_non_zero_fail_wrong_succ(i8 %x) { 112; CHECK-LABEL: @phi_ule_non_zero_fail_wrong_succ( 113; CHECK-NEXT: entry: 114; CHECK-NEXT: [[CMP:%.*]] = icmp ule i8 [[X:%.*]], 123 115; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 116; CHECK: T: 117; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 118; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0 119; CHECK-NEXT: ret i1 [[R]] 120; CHECK: F: 121; CHECK-NEXT: br label [[T]] 122; 123entry: 124 %cmp = icmp ule i8 %x, 123 125 br i1 %cmp, label %T, label %F 126T: 127 %v = phi i8 [ %x, %entry], [-1, %F] 128 %r = icmp eq i8 %v, 0 129 ret i1 %r 130F: 131 br label %T 132} 133 134define i1 @phi_ult_non_zero_fail(i8 %x) { 135; CHECK-LABEL: @phi_ult_non_zero_fail( 136; CHECK-NEXT: entry: 137; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[X:%.*]], 123 138; CHECK-NEXT: [[X2:%.*]] = add i8 [[X]], [[X]] 139; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 140; CHECK: T: 141; CHECK-NEXT: br label [[F]] 142; CHECK: F: 143; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X2]], [[ENTRY:%.*]] ], [ -1, [[T]] ] 144; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0 145; CHECK-NEXT: ret i1 [[R]] 146; 147entry: 148 %cmp = icmp ult i8 %x, 123 149 %x2 = add i8 %x, %x 150 br i1 %cmp, label %T, label %F 151T: 152 br label %F 153F: 154 %v = phi i8 [ %x2, %entry], [-1, %T] 155 %r = icmp eq i8 %v, 0 156 ret i1 %r 157} 158 159define i1 @phi_ne_non_zero(i8 %x) { 160; CHECK-LABEL: @phi_ne_non_zero( 161; CHECK-NEXT: entry: 162; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X:%.*]], 0 163; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 164; CHECK: T: 165; CHECK-NEXT: ret i1 false 166; CHECK: F: 167; CHECK-NEXT: br label [[T]] 168; 169entry: 170 %cmp = icmp ne i8 %x, 0 171 br i1 %cmp, label %T, label %F 172T: 173 %v = phi i8 [ %x, %entry], [-1, %F] 174 %r = icmp eq i8 %v, 0 175 ret i1 %r 176F: 177 br label %T 178} 179 180define i1 @phi_eq_non_zero(i8 %x) { 181; CHECK-LABEL: @phi_eq_non_zero( 182; CHECK-NEXT: entry: 183; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 44 184; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 185; CHECK: T: 186; CHECK-NEXT: ret i1 false 187; CHECK: F: 188; CHECK-NEXT: br label [[T]] 189; 190entry: 191 %cmp = icmp eq i8 %x, 44 192 br i1 %cmp, label %T, label %F 193T: 194 %v = phi i8 [ %x, %entry], [-1, %F] 195 %r = icmp eq i8 %v, 0 196 ret i1 %r 197F: 198 br label %T 199} 200 201define i1 @phi_eq_non_zero2(i8 %x) { 202; CHECK-LABEL: @phi_eq_non_zero2( 203; CHECK-NEXT: entry: 204; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[X:%.*]], 0 205; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 206; CHECK: T: 207; CHECK-NEXT: br label [[F]] 208; CHECK: F: 209; CHECK-NEXT: ret i1 false 210; 211entry: 212 %cmp = icmp eq i8 %x, 0 213 br i1 %cmp, label %T, label %F 214T: 215 br label %F 216F: 217 %v = phi i8 [ %x, %entry], [-1, %T] 218 %r = icmp eq i8 %v, 0 219 ret i1 %r 220} 221 222define i1 @phi_sgt_non_zero(i8 %x) { 223; CHECK-LABEL: @phi_sgt_non_zero( 224; CHECK-NEXT: entry: 225; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 1 226; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 227; CHECK: T: 228; CHECK-NEXT: ret i1 false 229; CHECK: F: 230; CHECK-NEXT: br label [[T]] 231; 232entry: 233 %cmp = icmp sgt i8 %x, 1 234 br i1 %cmp, label %T, label %F 235T: 236 %v = phi i8 [ %x, %entry], [-1, %F] 237 %r = icmp eq i8 %v, 0 238 ret i1 %r 239F: 240 br label %T 241} 242 243define i1 @phi_sgt_non_zero_fail(i8 %x) { 244; CHECK-LABEL: @phi_sgt_non_zero_fail( 245; CHECK-NEXT: entry: 246; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], -1 247; CHECK-NEXT: br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]] 248; CHECK: T: 249; CHECK-NEXT: [[V:%.*]] = phi i8 [ [[X]], [[ENTRY:%.*]] ], [ -1, [[F]] ] 250; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0 251; CHECK-NEXT: ret i1 [[R]] 252; CHECK: F: 253; CHECK-NEXT: br label [[T]] 254; 255entry: 256 %cmp = icmp sgt i8 %x, -1 257 br i1 %cmp, label %T, label %F 258T: 259 %v = phi i8 [ %x, %entry], [-1, %F] 260 %r = icmp eq i8 %v, 0 261 ret i1 %r 262F: 263 br label %T 264} 265