114da287eSFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 28ebb3eacSBjorn Pettersson; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 314da287eSFlorian Hahn 414da287eSFlorian Hahndefine i1 @wrapping_add_unknown_1(i8 %a) { 514da287eSFlorian Hahn; CHECK-LABEL: @wrapping_add_unknown_1( 614da287eSFlorian Hahn; CHECK-NEXT: entry: 714da287eSFlorian Hahn; CHECK-NEXT: [[SUB:%.*]] = add i8 [[A:%.*]], -1 814da287eSFlorian Hahn; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SUB]], 0 914da287eSFlorian Hahn; CHECK-NEXT: ret i1 [[CMP]] 1014da287eSFlorian Hahn; 1114da287eSFlorian Hahnentry: 1214da287eSFlorian Hahn %sub = add i8 %a, -1 1314da287eSFlorian Hahn %cmp = icmp eq i8 %sub, 0 1414da287eSFlorian Hahn ret i1 %cmp 1514da287eSFlorian Hahn} 1614da287eSFlorian Hahn 1714da287eSFlorian Hahndefine i1 @wrapping_add_known_1(i8 %a) { 1814da287eSFlorian Hahn; CHECK-LABEL: @wrapping_add_known_1( 1914da287eSFlorian Hahn; CHECK-NEXT: entry: 2014da287eSFlorian Hahn; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1 2114da287eSFlorian Hahn; CHECK-NEXT: br i1 [[PRE]], label [[THEN:%.*]], label [[ELSE:%.*]] 2214da287eSFlorian Hahn; CHECK: then: 2314da287eSFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1 2466400fc2SFlorian Hahn; CHECK-NEXT: ret i1 true 2514da287eSFlorian Hahn; CHECK: else: 2614da287eSFlorian Hahn; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -1 2714da287eSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[SUB_2]], 0 2814da287eSFlorian Hahn; CHECK-NEXT: ret i1 [[C_2]] 2914da287eSFlorian Hahn; 3014da287eSFlorian Hahnentry: 3114da287eSFlorian Hahn %pre = icmp eq i8 %a, 1 3214da287eSFlorian Hahn br i1 %pre, label %then, label %else 3314da287eSFlorian Hahn 3414da287eSFlorian Hahnthen: 3514da287eSFlorian Hahn %sub.1 = add i8 %a, -1 3614da287eSFlorian Hahn %c.1 = icmp eq i8 %sub.1, 0 3714da287eSFlorian Hahn ret i1 %c.1 3814da287eSFlorian Hahn 3914da287eSFlorian Hahnelse: 4014da287eSFlorian Hahn %sub.2 = add i8 %a, -1 4114da287eSFlorian Hahn %c.2 = icmp eq i8 %sub.2, 0 4214da287eSFlorian Hahn ret i1 %c.2 4314da287eSFlorian Hahn} 4414da287eSFlorian Hahn 4514da287eSFlorian Hahndefine i1 @wrapping_add_unknown_2(i8 %a) { 4614da287eSFlorian Hahn; CHECK-LABEL: @wrapping_add_unknown_2( 4714da287eSFlorian Hahn; CHECK-NEXT: entry: 4814da287eSFlorian Hahn; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 0 4914da287eSFlorian Hahn; CHECK-NEXT: br i1 [[PRE]], label [[THEN:%.*]], label [[ELSE:%.*]] 5014da287eSFlorian Hahn; CHECK: then: 5114da287eSFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1 5214da287eSFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp eq i8 [[SUB_1]], 0 5314da287eSFlorian Hahn; CHECK-NEXT: ret i1 [[C_1]] 5414da287eSFlorian Hahn; CHECK: else: 5514da287eSFlorian Hahn; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -1 5614da287eSFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[SUB_2]], 0 5714da287eSFlorian Hahn; CHECK-NEXT: ret i1 [[C_2]] 5814da287eSFlorian Hahn; 5914da287eSFlorian Hahnentry: 6014da287eSFlorian Hahn %pre = icmp eq i8 %a, 0 6114da287eSFlorian Hahn br i1 %pre, label %then, label %else 6214da287eSFlorian Hahn 6314da287eSFlorian Hahnthen: 6414da287eSFlorian Hahn %sub.1 = add i8 %a, -1 6514da287eSFlorian Hahn %c.1 = icmp eq i8 %sub.1, 0 6614da287eSFlorian Hahn ret i1 %c.1 6714da287eSFlorian Hahn 6814da287eSFlorian Hahnelse: 6914da287eSFlorian Hahn %sub.2 = add i8 %a, -1 7014da287eSFlorian Hahn %c.2 = icmp eq i8 %sub.2, 0 7114da287eSFlorian Hahn ret i1 %c.2 7214da287eSFlorian Hahn} 73d1e1a405SFlorian Hahn 74d1e1a405SFlorian Hahn; Test from https://github.com/llvm/llvm-project/issues/48253. 75d1e1a405SFlorian Hahndefine i1 @test_48253_eq_ne(i8 %a, i8 %b) { 76d1e1a405SFlorian Hahn; CHECK-LABEL: @test_48253_eq_ne( 77d1e1a405SFlorian Hahn; CHECK-NEXT: entry: 78d1e1a405SFlorian Hahn; CHECK-NEXT: [[CMP_1:%.*]] = icmp ne i8 [[A:%.*]], [[B:%.*]] 79d1e1a405SFlorian Hahn; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i8 [[B]], 0 80d1e1a405SFlorian Hahn; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_1]], [[CMP_2]] 81d1e1a405SFlorian Hahn; CHECK-NEXT: br i1 [[OR]], label [[EXIT_1:%.*]], label [[IF_END:%.*]] 82d1e1a405SFlorian Hahn; CHECK: if.end: 83d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[B]], -1 84d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[B]], -2 85d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[SUB_2]], [[A]] 8666400fc2SFlorian Hahn; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, [[C_2]] 87d1e1a405SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_1]] 88d1e1a405SFlorian Hahn; CHECK: exit.1: 89d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[B]], -1 90d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[SUB_3]], [[A]] 91d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[B]], -2 92d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[SUB_4]], [[A]] 93d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[C_3]], [[C_4]] 94d1e1a405SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_2]] 95d1e1a405SFlorian Hahn; 96d1e1a405SFlorian Hahnentry: 97d1e1a405SFlorian Hahn %cmp.1 = icmp ne i8 %a, %b 98d1e1a405SFlorian Hahn %cmp.2 = icmp eq i8 %b, 0 99d1e1a405SFlorian Hahn %or = or i1 %cmp.1, %cmp.2 100d1e1a405SFlorian Hahn br i1 %or, label %exit.1, label %if.end 101d1e1a405SFlorian Hahn 102d1e1a405SFlorian Hahnif.end: 103d1e1a405SFlorian Hahn %sub.1 = add i8 %b, -1 104d1e1a405SFlorian Hahn %t.1 = icmp ult i8 %sub.1, %a 105d1e1a405SFlorian Hahn %sub.2 = add i8 %b, -2 106d1e1a405SFlorian Hahn %c.2 = icmp ult i8 %sub.2, %a 107d1e1a405SFlorian Hahn %xor.1 = xor i1 %t.1, %c.2 108d1e1a405SFlorian Hahn ret i1 %xor.1 109d1e1a405SFlorian Hahn 110d1e1a405SFlorian Hahnexit.1: 111d1e1a405SFlorian Hahn %sub.3 = add i8 %b, -1 112d1e1a405SFlorian Hahn %c.3 = icmp ult i8 %sub.3, %a 113d1e1a405SFlorian Hahn %sub.4 = add i8 %b, -2 114d1e1a405SFlorian Hahn %c.4 = icmp ult i8 %sub.4, %a 115d1e1a405SFlorian Hahn %xor.2 = xor i1 %c.3, %c.4 116d1e1a405SFlorian Hahn ret i1 %xor.2 117d1e1a405SFlorian Hahn} 118d1e1a405SFlorian Hahn 119d1e1a405SFlorian Hahndefine i1 @test_ult(i8 %a, i8 %b) { 120d1e1a405SFlorian Hahn; CHECK-LABEL: @test_ult( 121d1e1a405SFlorian Hahn; CHECK-NEXT: entry: 122d1e1a405SFlorian Hahn; CHECK-NEXT: [[CMP_1:%.*]] = icmp uge i8 [[A:%.*]], 20 123d1e1a405SFlorian Hahn; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i8 [[A]], [[B:%.*]] 124d1e1a405SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]] 125d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1 126d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -2 127d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[A]], -20 128d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[A]], 21 129d1e1a405SFlorian Hahn; CHECK-NEXT: [[ADD_1:%.*]] = add i8 [[A]], 1 130d1e1a405SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]] 131d1e1a405SFlorian Hahn; CHECK: if.end: 13266400fc2SFlorian Hahn; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true 13366400fc2SFlorian Hahn; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], true 134d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[SUB_4]], [[B]] 135d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]] 136d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[ADD_1]], [[B]] 137d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]] 138d1e1a405SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_4]] 139d1e1a405SFlorian Hahn; CHECK: exit.1: 140d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[SUB_1]], [[B]] 141d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[SUB_2]], [[B]] 142d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]] 143d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp ult i8 [[SUB_3]], [[B]] 144d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]] 145d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp ult i8 [[SUB_4]], [[B]] 146d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]] 147d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp ult i8 [[ADD_1]], [[B]] 148d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]] 149d1e1a405SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_8]] 150d1e1a405SFlorian Hahn; 151d1e1a405SFlorian Hahnentry: 152d1e1a405SFlorian Hahn %cmp.1 = icmp uge i8 %a, 20 153d1e1a405SFlorian Hahn %cmp.2 = icmp ult i8 %a, %b 154d1e1a405SFlorian Hahn %and = and i1 %cmp.1, %cmp.2 155d1e1a405SFlorian Hahn %sub.1 = add i8 %a, -1 156d1e1a405SFlorian Hahn %sub.2 = add i8 %a, -2 157d1e1a405SFlorian Hahn %sub.3 = add i8 %a, -20 158d1e1a405SFlorian Hahn %sub.4 = add i8 %a, 21 159d1e1a405SFlorian Hahn %add.1 = add i8 %a, 1 160d1e1a405SFlorian Hahn br i1 %and, label %if.end, label %exit.1 161d1e1a405SFlorian Hahn 162d1e1a405SFlorian Hahnif.end: 163d1e1a405SFlorian Hahn %t.1 = icmp ult i8 %sub.1, %b 164d1e1a405SFlorian Hahn %t.2 = icmp ult i8 %sub.2, %b 165d1e1a405SFlorian Hahn %xor.1 = xor i1 %t.1, %t.2 166d1e1a405SFlorian Hahn 167d1e1a405SFlorian Hahn %t.3 = icmp ult i8 %sub.3, %b 168d1e1a405SFlorian Hahn %xor.2 = xor i1 %xor.1, %t.3 169d1e1a405SFlorian Hahn 170d1e1a405SFlorian Hahn %c.1 = icmp ult i8 %sub.4, %b 171d1e1a405SFlorian Hahn %xor.3 = xor i1 %xor.2, %c.1 172d1e1a405SFlorian Hahn 173d1e1a405SFlorian Hahn %c.2 = icmp ult i8 %add.1, %b 174d1e1a405SFlorian Hahn %xor.4 = xor i1 %xor.3, %c.2 175d1e1a405SFlorian Hahn ret i1 %xor.4 176d1e1a405SFlorian Hahn 177d1e1a405SFlorian Hahnexit.1: 178d1e1a405SFlorian Hahn %c.3 = icmp ult i8 %sub.1, %b 179d1e1a405SFlorian Hahn %c.4 = icmp ult i8 %sub.2, %b 180d1e1a405SFlorian Hahn %xor.5 = xor i1 %c.3, %c.4 181d1e1a405SFlorian Hahn 182d1e1a405SFlorian Hahn %c.5 = icmp ult i8 %sub.3, %b 183d1e1a405SFlorian Hahn %xor.6 = xor i1 %xor.5, %c.5 184d1e1a405SFlorian Hahn 185d1e1a405SFlorian Hahn %c.6 = icmp ult i8 %sub.4, %b 186d1e1a405SFlorian Hahn %xor.7 = xor i1 %xor.6, %c.6 187d1e1a405SFlorian Hahn 188d1e1a405SFlorian Hahn %c.7 = icmp ult i8 %add.1, %b 189d1e1a405SFlorian Hahn %xor.8 = xor i1 %xor.7, %c.7 190d1e1a405SFlorian Hahn ret i1 %xor.8 191d1e1a405SFlorian Hahn} 192d1e1a405SFlorian Hahn 193d1e1a405SFlorian Hahndefine i1 @test_slt(i8 %a, i8 %b) { 194d1e1a405SFlorian Hahn; CHECK-LABEL: @test_slt( 195d1e1a405SFlorian Hahn; CHECK-NEXT: entry: 196d1e1a405SFlorian Hahn; CHECK-NEXT: [[CMP_1:%.*]] = icmp sge i8 [[A:%.*]], 20 197d1e1a405SFlorian Hahn; CHECK-NEXT: [[CMP_2:%.*]] = icmp slt i8 [[A]], [[B:%.*]] 198d1e1a405SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP_1]], [[CMP_2]] 199d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1 200d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_2:%.*]] = add i8 [[A]], -2 201d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_3:%.*]] = add i8 [[A]], -20 202d1e1a405SFlorian Hahn; CHECK-NEXT: [[SUB_4:%.*]] = add i8 [[A]], 21 203d1e1a405SFlorian Hahn; CHECK-NEXT: [[ADD_1:%.*]] = add i8 [[A]], 1 204d1e1a405SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[IF_END:%.*]], label [[EXIT_1:%.*]] 205d1e1a405SFlorian Hahn; CHECK: if.end: 206d1e1a405SFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp slt i8 [[SUB_1]], [[B]] 207d1e1a405SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp slt i8 [[SUB_2]], [[B]] 208d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 [[T_1]], [[T_2]] 209d1e1a405SFlorian Hahn; CHECK-NEXT: [[T_3:%.*]] = icmp slt i8 [[SUB_3]], [[B]] 210d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], [[T_3]] 211d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[SUB_4]], [[B]] 212d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], [[C_1]] 213d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp slt i8 [[ADD_1]], [[B]] 214d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], [[C_2]] 215d1e1a405SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_4]] 216d1e1a405SFlorian Hahn; CHECK: exit.1: 217d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[SUB_1]], [[B]] 218d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[SUB_2]], [[B]] 219d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[C_3]], [[C_4]] 220d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp slt i8 [[SUB_3]], [[B]] 221d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_5]] 222d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_6:%.*]] = icmp slt i8 [[SUB_4]], [[B]] 223d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[XOR_6]], [[C_6]] 224d1e1a405SFlorian Hahn; CHECK-NEXT: [[C_7:%.*]] = icmp slt i8 [[ADD_1]], [[B]] 225d1e1a405SFlorian Hahn; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[C_7]] 226d1e1a405SFlorian Hahn; CHECK-NEXT: ret i1 [[XOR_8]] 227d1e1a405SFlorian Hahn; 228d1e1a405SFlorian Hahnentry: 229d1e1a405SFlorian Hahn %cmp.1 = icmp sge i8 %a, 20 230d1e1a405SFlorian Hahn %cmp.2 = icmp slt i8 %a, %b 231d1e1a405SFlorian Hahn %and = and i1 %cmp.1, %cmp.2 232d1e1a405SFlorian Hahn %sub.1 = add i8 %a, -1 233d1e1a405SFlorian Hahn %sub.2 = add i8 %a, -2 234d1e1a405SFlorian Hahn %sub.3 = add i8 %a, -20 235d1e1a405SFlorian Hahn %sub.4 = add i8 %a, 21 236d1e1a405SFlorian Hahn %add.1 = add i8 %a, 1 237d1e1a405SFlorian Hahn br i1 %and, label %if.end, label %exit.1 238d1e1a405SFlorian Hahn 239d1e1a405SFlorian Hahnif.end: 240d1e1a405SFlorian Hahn %t.1 = icmp slt i8 %sub.1, %b 241d1e1a405SFlorian Hahn %t.2 = icmp slt i8 %sub.2, %b 242d1e1a405SFlorian Hahn %xor.1 = xor i1 %t.1, %t.2 243d1e1a405SFlorian Hahn 244d1e1a405SFlorian Hahn %t.3 = icmp slt i8 %sub.3, %b 245d1e1a405SFlorian Hahn %xor.2 = xor i1 %xor.1, %t.3 246d1e1a405SFlorian Hahn 247d1e1a405SFlorian Hahn %c.1 = icmp slt i8 %sub.4, %b 248d1e1a405SFlorian Hahn %xor.3 = xor i1 %xor.2, %c.1 249d1e1a405SFlorian Hahn 250d1e1a405SFlorian Hahn %c.2 = icmp slt i8 %add.1, %b 251d1e1a405SFlorian Hahn %xor.4 = xor i1 %xor.3, %c.2 252d1e1a405SFlorian Hahn ret i1 %xor.4 253d1e1a405SFlorian Hahn 254d1e1a405SFlorian Hahnexit.1: 255d1e1a405SFlorian Hahn %c.3 = icmp slt i8 %sub.1, %b 256d1e1a405SFlorian Hahn %c.4 = icmp slt i8 %sub.2, %b 257d1e1a405SFlorian Hahn %xor.5 = xor i1 %c.3, %c.4 258d1e1a405SFlorian Hahn 259d1e1a405SFlorian Hahn %c.5 = icmp slt i8 %sub.3, %b 260d1e1a405SFlorian Hahn %xor.6 = xor i1 %xor.5, %c.5 261d1e1a405SFlorian Hahn 262d1e1a405SFlorian Hahn %c.6 = icmp slt i8 %sub.4, %b 263d1e1a405SFlorian Hahn %xor.7 = xor i1 %xor.6, %c.6 264d1e1a405SFlorian Hahn 265d1e1a405SFlorian Hahn %c.7 = icmp slt i8 %add.1, %b 266d1e1a405SFlorian Hahn %xor.8 = xor i1 %xor.7, %c.7 267d1e1a405SFlorian Hahn ret i1 %xor.8 268d1e1a405SFlorian Hahn} 26962c19284SFlorian Hahn 27062c19284SFlorian Hahndefine i1 @wrapping_add_known_1_add_nuw(i8 %a) { 27162c19284SFlorian Hahn; CHECK-LABEL: @wrapping_add_known_1_add_nuw( 27262c19284SFlorian Hahn; CHECK-NEXT: entry: 27362c19284SFlorian Hahn; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1 27462c19284SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]]) 27562c19284SFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[A]], -1 27662c19284SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[SUB_1]], 10 277*f213128bSFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true 278*f213128bSFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false 27962c19284SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 28062c19284SFlorian Hahn; 28162c19284SFlorian Hahnentry: 28262c19284SFlorian Hahn %pre = icmp eq i8 %a, 1 28362c19284SFlorian Hahn call void @llvm.assume(i1 %pre) 28462c19284SFlorian Hahn %sub.1 = add i8 %a, -1 28562c19284SFlorian Hahn %add = add nuw i8 %sub.1, 10 28662c19284SFlorian Hahn %t.1 = icmp uge i8 %add, 10 28762c19284SFlorian Hahn %t.2 = icmp ule i8 %add, 10 28862c19284SFlorian Hahn %res.1 = xor i1 %t.1, %t.2 28962c19284SFlorian Hahn %f.1 = icmp ult i8 %add, 10 29062c19284SFlorian Hahn %res.2 = xor i1 %res.1, %f.1 29162c19284SFlorian Hahn ret i1 %res.2 29262c19284SFlorian Hahn} 29362c19284SFlorian Hahn 29462c19284SFlorian Hahndefine i1 @add_nuw_wrapping_add_known_1(i8 %a) { 29562c19284SFlorian Hahn; CHECK-LABEL: @add_nuw_wrapping_add_known_1( 29662c19284SFlorian Hahn; CHECK-NEXT: entry: 29762c19284SFlorian Hahn; CHECK-NEXT: [[PRE:%.*]] = icmp eq i8 [[A:%.*]], 1 29862c19284SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]]) 29962c19284SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], 10 30062c19284SFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[ADD]], -1 301*f213128bSFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true 302*f213128bSFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], false 30362c19284SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 30462c19284SFlorian Hahn; 30562c19284SFlorian Hahnentry: 30662c19284SFlorian Hahn %pre = icmp eq i8 %a, 1 30762c19284SFlorian Hahn call void @llvm.assume(i1 %pre) 30862c19284SFlorian Hahn %add = add nuw i8 %a, 10 30962c19284SFlorian Hahn %sub.1 = add i8 %add, -1 31062c19284SFlorian Hahn %t.1 = icmp uge i8 %sub.1, 10 31162c19284SFlorian Hahn %t.2 = icmp ule i8 %sub.1, 10 31262c19284SFlorian Hahn %res.1 = xor i1 %t.1, %t.2 31362c19284SFlorian Hahn %f.1 = icmp ult i8 %sub.1, 10 31462c19284SFlorian Hahn %res.2 = xor i1 %res.1, %f.1 31562c19284SFlorian Hahn ret i1 %res.2 31662c19284SFlorian Hahn} 31762c19284SFlorian Hahn 31862c19284SFlorian Hahndefine i1 @add_nuw_wrapping_add_not_known_1(i8 %a) { 31962c19284SFlorian Hahn; CHECK-LABEL: @add_nuw_wrapping_add_not_known_1( 32062c19284SFlorian Hahn; CHECK-NEXT: entry: 32162c19284SFlorian Hahn; CHECK-NEXT: [[PRE:%.*]] = icmp sge i8 [[A:%.*]], -1 32262c19284SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[PRE]]) 32362c19284SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[A]], 10 32462c19284SFlorian Hahn; CHECK-NEXT: [[SUB_1:%.*]] = add i8 [[ADD]], -1 32562c19284SFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[SUB_1]], 10 32662c19284SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[SUB_1]], 10 32762c19284SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[T_1]], [[T_2]] 32862c19284SFlorian Hahn; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[SUB_1]], 10 32962c19284SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[F_1]] 33062c19284SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 33162c19284SFlorian Hahn; 33262c19284SFlorian Hahnentry: 33362c19284SFlorian Hahn %pre = icmp sge i8 %a, -1 33462c19284SFlorian Hahn call void @llvm.assume(i1 %pre) 33562c19284SFlorian Hahn %add = add nuw i8 %a, 10 33662c19284SFlorian Hahn %sub.1 = add i8 %add, -1 33762c19284SFlorian Hahn %t.1 = icmp uge i8 %sub.1, 10 33862c19284SFlorian Hahn %t.2 = icmp ule i8 %sub.1, 10 33962c19284SFlorian Hahn %res.1 = xor i1 %t.1, %t.2 34062c19284SFlorian Hahn %f.1 = icmp ult i8 %sub.1, 10 34162c19284SFlorian Hahn %res.2 = xor i1 %res.1, %f.1 34262c19284SFlorian Hahn ret i1 %res.2 34362c19284SFlorian Hahn} 34462c19284SFlorian Hahn 34562c19284SFlorian Hahndeclare void @llvm.assume(i1) 346