1c259a2b9SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 227d1d8bcSRoman Lebedev; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3c259a2b9SFlorian Hahn 4c259a2b9SFlorian Hahndefine i1 @idx_known_positive_via_len_1(i8 %len, i8 %idx) { 5c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_known_positive_via_len_1( 6c259a2b9SFlorian Hahn; CHECK-NEXT: entry: 7c259a2b9SFlorian Hahn; CHECK-NEXT: [[LEN_POS:%.*]] = icmp sge i8 [[LEN:%.*]], 0 8c259a2b9SFlorian Hahn; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN]] 9c259a2b9SFlorian Hahn; CHECK-NEXT: [[AND_1:%.*]] = and i1 [[LEN_POS]], [[IDX_ULT_LEN]] 10c259a2b9SFlorian Hahn; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]] 11c259a2b9SFlorian Hahn; CHECK: then.1: 1292f87787SFlorian Hahn; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true 13c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[IDX]], 1 14c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]] 1592f87787SFlorian Hahn; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], true 16c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[R_3]] 17c259a2b9SFlorian Hahn; CHECK: else: 18c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 0 19c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[C_3]] 20c259a2b9SFlorian Hahn; 21c259a2b9SFlorian Hahnentry: 22c259a2b9SFlorian Hahn %len.pos = icmp sge i8 %len, 0 23c259a2b9SFlorian Hahn %idx.ult.len = icmp ult i8 %idx, %len 24c259a2b9SFlorian Hahn %and.1 = and i1 %len.pos, %idx.ult.len 25c259a2b9SFlorian Hahn br i1 %and.1, label %then.1, label %else 26c259a2b9SFlorian Hahn 27c259a2b9SFlorian Hahnthen.1: 28c259a2b9SFlorian Hahn %t.1 = icmp ult i8 %idx, %len 29c259a2b9SFlorian Hahn %t.2 = icmp sge i8 %idx, 0 30c259a2b9SFlorian Hahn %r.1 = xor i1 %t.1, %t.2 31c259a2b9SFlorian Hahn 32c259a2b9SFlorian Hahn %c.1 = icmp sge i8 %idx, 1 33c259a2b9SFlorian Hahn %r.2 = xor i1 %r.1, %c.1 34c259a2b9SFlorian Hahn 35c259a2b9SFlorian Hahn %c.2 = icmp sge i8 %len, 1 36c259a2b9SFlorian Hahn %r.3 = xor i1 %r.2, %c.2 37c259a2b9SFlorian Hahn ret i1 %r.3 38c259a2b9SFlorian Hahn 39c259a2b9SFlorian Hahnelse: 40c259a2b9SFlorian Hahn %c.3 = icmp sge i8 %idx, 0 41c259a2b9SFlorian Hahn ret i1 %c.3 42c259a2b9SFlorian Hahn} 43c259a2b9SFlorian Hahn 44c259a2b9SFlorian Hahn; Like @idx_known_positive_via_len_1, but with a different order of known facts. 45c259a2b9SFlorian Hahndefine i1 @idx_known_positive_via_len_2(i8 %len, i8 %idx) { 46c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_known_positive_via_len_2( 47c259a2b9SFlorian Hahn; CHECK-NEXT: entry: 48c259a2b9SFlorian Hahn; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]] 49c259a2b9SFlorian Hahn; CHECK-NEXT: [[LEN_POS:%.*]] = icmp sge i8 [[LEN]], 0 50c259a2b9SFlorian Hahn; CHECK-NEXT: [[AND_1:%.*]] = and i1 [[IDX_ULT_LEN]], [[LEN_POS]] 51c259a2b9SFlorian Hahn; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]] 52c259a2b9SFlorian Hahn; CHECK: then.1: 538e3e9629SFlorian Hahn; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true 54c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[IDX]], 1 55c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_1]] 568e3e9629SFlorian Hahn; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], true 57c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[R_3]] 58c259a2b9SFlorian Hahn; CHECK: else: 59c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 0 60c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[C_3]] 61c259a2b9SFlorian Hahn; 62c259a2b9SFlorian Hahnentry: 63c259a2b9SFlorian Hahn %idx.ult.len = icmp ult i8 %idx, %len 64c259a2b9SFlorian Hahn %len.pos = icmp sge i8 %len, 0 65c259a2b9SFlorian Hahn %and.1 = and i1 %idx.ult.len, %len.pos 66c259a2b9SFlorian Hahn br i1 %and.1, label %then.1, label %else 67c259a2b9SFlorian Hahn 68c259a2b9SFlorian Hahnthen.1: 69c259a2b9SFlorian Hahn %t.1 = icmp ult i8 %idx, %len 70c259a2b9SFlorian Hahn %t.2 = icmp sge i8 %idx, 0 71c259a2b9SFlorian Hahn %r.1 = xor i1 %t.1, %t.2 72c259a2b9SFlorian Hahn 73c259a2b9SFlorian Hahn %c.1 = icmp sge i8 %idx, 1 74c259a2b9SFlorian Hahn %r.2 = xor i1 %r.1, %c.1 75c259a2b9SFlorian Hahn 76c259a2b9SFlorian Hahn %c.2 = icmp sge i8 %len, 1 77c259a2b9SFlorian Hahn %r.3 = xor i1 %r.2, %c.2 78c259a2b9SFlorian Hahn ret i1 %r.3 79c259a2b9SFlorian Hahn 80c259a2b9SFlorian Hahnelse: 81c259a2b9SFlorian Hahn %c.3 = icmp sge i8 %idx, 0 82c259a2b9SFlorian Hahn ret i1 %c.3 83c259a2b9SFlorian Hahn} 84c259a2b9SFlorian Hahn 85c259a2b9SFlorian Hahn 86c259a2b9SFlorian Hahn; %len >=u 0 is not enough to determine idx >=s 0. 87c259a2b9SFlorian Hahndefine i1 @idx_not_known_positive_via_len_uge(i8 %len, i8 %idx) { 88c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_not_known_positive_via_len_uge( 89c259a2b9SFlorian Hahn; CHECK-NEXT: entry: 90*98e016d9SFlorian Hahn; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]] 91*98e016d9SFlorian Hahn; CHECK-NEXT: [[AND_1:%.*]] = and i1 true, [[IDX_ULT_LEN]] 92c259a2b9SFlorian Hahn; CHECK-NEXT: br i1 [[AND_1]], label [[THEN_1:%.*]], label [[ELSE:%.*]] 93c259a2b9SFlorian Hahn; CHECK: then.1: 94c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[IDX]], 0 95c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, [[C_2]] 96c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 1 97c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]] 98c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[LEN]], 1 99c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]] 100c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[R_3]] 101c259a2b9SFlorian Hahn; CHECK: else: 102c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp sge i8 [[IDX]], 0 103c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[C_5]] 104c259a2b9SFlorian Hahn; 105c259a2b9SFlorian Hahnentry: 106c259a2b9SFlorian Hahn %len.pos = icmp uge i8 %len, 0 107c259a2b9SFlorian Hahn %idx.ult.len = icmp ult i8 %idx, %len 108c259a2b9SFlorian Hahn %and.1 = and i1 %len.pos, %idx.ult.len 109c259a2b9SFlorian Hahn br i1 %and.1, label %then.1, label %else 110c259a2b9SFlorian Hahn 111c259a2b9SFlorian Hahnthen.1: 112c259a2b9SFlorian Hahn %c.1 = icmp ult i8 %idx, %len 113c259a2b9SFlorian Hahn %c.2 = icmp sge i8 %idx, 0 114c259a2b9SFlorian Hahn %r.1 = xor i1 %c.1, %c.2 115c259a2b9SFlorian Hahn 116c259a2b9SFlorian Hahn %c.3 = icmp sge i8 %idx, 1 117c259a2b9SFlorian Hahn %r.2 = xor i1 %r.1, %c.3 118c259a2b9SFlorian Hahn 119c259a2b9SFlorian Hahn %c.4 = icmp sge i8 %len, 1 120c259a2b9SFlorian Hahn %r.3 = xor i1 %r.2, %c.4 121c259a2b9SFlorian Hahn ret i1 %r.3 122c259a2b9SFlorian Hahn 123c259a2b9SFlorian Hahnelse: 124c259a2b9SFlorian Hahn %c.5 = icmp sge i8 %idx, 0 125c259a2b9SFlorian Hahn ret i1 %c.5 126c259a2b9SFlorian Hahn} 127c259a2b9SFlorian Hahn 128c259a2b9SFlorian Hahn; There's no information about %len which could be used to determine %len >=s 0. 129c259a2b9SFlorian Hahndefine i1 @idx_not_known_positive_via_len(i8 %len, i8 %idx) { 130c259a2b9SFlorian Hahn; CHECK-LABEL: @idx_not_known_positive_via_len( 131c259a2b9SFlorian Hahn; CHECK-NEXT: entry: 132c259a2b9SFlorian Hahn; CHECK-NEXT: [[IDX_ULT_LEN:%.*]] = icmp ult i8 [[IDX:%.*]], [[LEN:%.*]] 133c259a2b9SFlorian Hahn; CHECK-NEXT: br i1 [[IDX_ULT_LEN]], label [[THEN_1:%.*]], label [[ELSE:%.*]] 134c259a2b9SFlorian Hahn; CHECK: then.1: 135c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[IDX]], 0 136c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, [[C_2]] 137c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp sge i8 [[IDX]], 1 138c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_2:%.*]] = xor i1 [[R_1]], [[C_3]] 139c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp sge i8 [[LEN]], 1 140c259a2b9SFlorian Hahn; CHECK-NEXT: [[R_3:%.*]] = xor i1 [[R_2]], [[C_4]] 141c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[R_3]] 142c259a2b9SFlorian Hahn; CHECK: else: 143c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_5:%.*]] = icmp sge i8 [[IDX]], 0 144c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[C_5]] 145c259a2b9SFlorian Hahn; 146c259a2b9SFlorian Hahnentry: 147c259a2b9SFlorian Hahn %idx.ult.len = icmp ult i8 %idx, %len 148c259a2b9SFlorian Hahn br i1 %idx.ult.len, label %then.1, label %else 149c259a2b9SFlorian Hahn 150c259a2b9SFlorian Hahnthen.1: 151c259a2b9SFlorian Hahn %c.1 = icmp ult i8 %idx, %len 152c259a2b9SFlorian Hahn %c.2 = icmp sge i8 %idx, 0 153c259a2b9SFlorian Hahn %r.1 = xor i1 %c.1, %c.2 154c259a2b9SFlorian Hahn 155c259a2b9SFlorian Hahn %c.3 = icmp sge i8 %idx, 1 156c259a2b9SFlorian Hahn %r.2 = xor i1 %r.1, %c.3 157c259a2b9SFlorian Hahn 158c259a2b9SFlorian Hahn %c.4 = icmp sge i8 %len, 1 159c259a2b9SFlorian Hahn %r.3 = xor i1 %r.2, %c.4 160c259a2b9SFlorian Hahn ret i1 %r.3 161c259a2b9SFlorian Hahn 162c259a2b9SFlorian Hahnelse: 163c259a2b9SFlorian Hahn %c.5 = icmp sge i8 %idx, 0 164c259a2b9SFlorian Hahn ret i1 %c.5 165c259a2b9SFlorian Hahn} 166c259a2b9SFlorian Hahn 167c259a2b9SFlorian Hahndefine i1 @ult_signed_pos_constant(i8 %a) { 168c259a2b9SFlorian Hahn; CHECK-LABEL: @ult_signed_pos_constant( 169c259a2b9SFlorian Hahn; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ult i8 [[A:%.*]], 4 170c259a2b9SFlorian Hahn; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]] 171c259a2b9SFlorian Hahn; CHECK: then: 17292f87787SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true 17392f87787SFlorian Hahn; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true 174c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_2]] 175c259a2b9SFlorian Hahn; CHECK: else: 176c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[A]], 0 177c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_3:%.*]] = icmp slt i8 [[A]], 4 178c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_2]], [[C_3]] 179c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_4:%.*]] = icmp slt i8 [[A]], 5 180c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 181c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_4]] 182c259a2b9SFlorian Hahn; 183c259a2b9SFlorian Hahn %a.ult.4 = icmp ult i8 %a, 4 184c259a2b9SFlorian Hahn br i1 %a.ult.4, label %then, label %else 185c259a2b9SFlorian Hahn 186c259a2b9SFlorian Hahnthen: 187c259a2b9SFlorian Hahn %t.0 = icmp sge i8 %a, 0 188c259a2b9SFlorian Hahn %t.1 = icmp slt i8 %a, 4 189c259a2b9SFlorian Hahn %res.1 = xor i1 %t.0, %t.1 190c259a2b9SFlorian Hahn 191c259a2b9SFlorian Hahn %c.0 = icmp slt i8 %a, 5 192c259a2b9SFlorian Hahn %res.2 = xor i1 %res.1, %c.0 193c259a2b9SFlorian Hahn ret i1 %res.2 194c259a2b9SFlorian Hahn 195c259a2b9SFlorian Hahnelse: 196c259a2b9SFlorian Hahn %c.2 = icmp sge i8 %a, 0 197c259a2b9SFlorian Hahn %c.3 = icmp slt i8 %a, 4 198c259a2b9SFlorian Hahn %res.3 = xor i1 %c.2, %c.3 199c259a2b9SFlorian Hahn 200c259a2b9SFlorian Hahn %c.4 = icmp slt i8 %a, 5 201c259a2b9SFlorian Hahn %res.4 = xor i1 %res.3, %c.4 202c259a2b9SFlorian Hahn 203c259a2b9SFlorian Hahn ret i1 %res.4 204c259a2b9SFlorian Hahn} 205c259a2b9SFlorian Hahn 206c259a2b9SFlorian Hahndefine i1 @ult_signed_neg_constant(i8 %a) { 207c259a2b9SFlorian Hahn; CHECK-LABEL: @ult_signed_neg_constant( 208c259a2b9SFlorian Hahn; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ult i8 [[A:%.*]], -2 209c259a2b9SFlorian Hahn; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]] 210c259a2b9SFlorian Hahn; CHECK: then: 211c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_0:%.*]] = icmp sge i8 [[A]], 0 212c259a2b9SFlorian Hahn; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[A]], -2 213c259a2b9SFlorian Hahn; CHECK-NEXT: [[RES_1:%.*]] = xor i1 [[C_0]], [[C_1]] 214c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 [[RES_1]] 215c259a2b9SFlorian Hahn; CHECK: else: 216c259a2b9SFlorian Hahn; CHECK-NEXT: ret i1 false 217c259a2b9SFlorian Hahn; 218c259a2b9SFlorian Hahn %a.ult.4 = icmp ult i8 %a, -2 219c259a2b9SFlorian Hahn br i1 %a.ult.4, label %then, label %else 220c259a2b9SFlorian Hahn 221c259a2b9SFlorian Hahnthen: 222c259a2b9SFlorian Hahn %c.0 = icmp sge i8 %a, 0 223c259a2b9SFlorian Hahn %c.1 = icmp slt i8 %a, -2 224c259a2b9SFlorian Hahn %res.1 = xor i1 %c.0, %c.1 225c259a2b9SFlorian Hahn ret i1 %res.1 226c259a2b9SFlorian Hahn 227c259a2b9SFlorian Hahnelse: 228c259a2b9SFlorian Hahn ret i1 0 229c259a2b9SFlorian Hahn} 230681315d1SAntonio Frighetto 231681315d1SAntonio Frighettodefine i1 @ule_signed_pos_constant_1(i8 %a, i8 %b) { 232681315d1SAntonio Frighetto; CHECK-LABEL: @ule_signed_pos_constant_1( 233681315d1SAntonio Frighetto; CHECK-NEXT: [[B_NON_NEG:%.*]] = icmp sge i8 [[B:%.*]], 0 234681315d1SAntonio Frighetto; CHECK-NEXT: call void @llvm.assume(i1 [[B_NON_NEG]]) 235681315d1SAntonio Frighetto; CHECK-NEXT: [[A_ULE_B:%.*]] = icmp ule i8 [[A:%.*]], [[B]] 236681315d1SAntonio Frighetto; CHECK-NEXT: call void @llvm.assume(i1 [[A_ULE_B]]) 237681315d1SAntonio Frighetto; CHECK-NEXT: [[SLT_TEST:%.*]] = icmp slt i8 [[A]], [[B]] 238241848b9SAntonio Frighetto; CHECK-NEXT: [[RESULT_XOR:%.*]] = xor i1 true, [[SLT_TEST]] 239681315d1SAntonio Frighetto; CHECK-NEXT: ret i1 [[RESULT_XOR]] 240681315d1SAntonio Frighetto; 241681315d1SAntonio Frighetto %b_non_neg = icmp sge i8 %b, 0 242681315d1SAntonio Frighetto call void @llvm.assume(i1 %b_non_neg) 243681315d1SAntonio Frighetto %a_ule_b = icmp ule i8 %a, %b 244681315d1SAntonio Frighetto call void @llvm.assume(i1 %a_ule_b) 245681315d1SAntonio Frighetto 246681315d1SAntonio Frighetto %sle_test = icmp sle i8 %a, %b 247681315d1SAntonio Frighetto %slt_test = icmp slt i8 %a, %b 248681315d1SAntonio Frighetto %result_xor = xor i1 %sle_test, %slt_test 249681315d1SAntonio Frighetto 250681315d1SAntonio Frighetto ret i1 %result_xor 251681315d1SAntonio Frighetto} 252681315d1SAntonio Frighetto 253681315d1SAntonio Frighettodefine i1 @ule_signed_pos_constant_2(i8 %a) { 254681315d1SAntonio Frighetto; CHECK-LABEL: @ule_signed_pos_constant_2( 255681315d1SAntonio Frighetto; CHECK-NEXT: [[A_ULT_4:%.*]] = icmp ule i8 [[A:%.*]], 4 256681315d1SAntonio Frighetto; CHECK-NEXT: br i1 [[A_ULT_4]], label [[THEN:%.*]], label [[ELSE:%.*]] 257681315d1SAntonio Frighetto; CHECK: then: 258241848b9SAntonio Frighetto; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true 259241848b9SAntonio Frighetto; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true 260681315d1SAntonio Frighetto; CHECK-NEXT: ret i1 [[RES_2]] 261681315d1SAntonio Frighetto; CHECK: else: 262681315d1SAntonio Frighetto; CHECK-NEXT: [[C_2:%.*]] = icmp sge i8 [[A]], 0 263681315d1SAntonio Frighetto; CHECK-NEXT: [[C_3:%.*]] = icmp sle i8 [[A]], 4 264681315d1SAntonio Frighetto; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[C_2]], [[C_3]] 265681315d1SAntonio Frighetto; CHECK-NEXT: [[C_4:%.*]] = icmp sle i8 [[A]], 5 266681315d1SAntonio Frighetto; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], [[C_4]] 267681315d1SAntonio Frighetto; CHECK-NEXT: ret i1 [[RES_4]] 268681315d1SAntonio Frighetto; 269681315d1SAntonio Frighetto %a.ult.4 = icmp ule i8 %a, 4 270681315d1SAntonio Frighetto br i1 %a.ult.4, label %then, label %else 271681315d1SAntonio Frighetto 272681315d1SAntonio Frighettothen: 273681315d1SAntonio Frighetto %t.0 = icmp sge i8 %a, 0 274681315d1SAntonio Frighetto %t.1 = icmp sle i8 %a, 4 275681315d1SAntonio Frighetto %res.1 = xor i1 %t.0, %t.1 276681315d1SAntonio Frighetto 277681315d1SAntonio Frighetto %c.0 = icmp sle i8 %a, 5 278681315d1SAntonio Frighetto %res.2 = xor i1 %res.1, %c.0 279681315d1SAntonio Frighetto ret i1 %res.2 280681315d1SAntonio Frighetto 281681315d1SAntonio Frighettoelse: 282681315d1SAntonio Frighetto %c.2 = icmp sge i8 %a, 0 283681315d1SAntonio Frighetto %c.3 = icmp sle i8 %a, 4 284681315d1SAntonio Frighetto %res.3 = xor i1 %c.2, %c.3 285681315d1SAntonio Frighetto 286681315d1SAntonio Frighetto %c.4 = icmp sle i8 %a, 5 287681315d1SAntonio Frighetto %res.4 = xor i1 %res.3, %c.4 288681315d1SAntonio Frighetto 289681315d1SAntonio Frighetto ret i1 %res.4 290681315d1SAntonio Frighetto} 291681315d1SAntonio Frighetto 292681315d1SAntonio Frighettodefine i1 @uge_assumed_positive_values(i8 %a, i8 %b) { 293681315d1SAntonio Frighetto; CHECK-LABEL: @uge_assumed_positive_values( 294681315d1SAntonio Frighetto; CHECK-NEXT: [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0 295681315d1SAntonio Frighetto; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]]) 296681315d1SAntonio Frighetto; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp uge i8 [[A]], [[B:%.*]] 297681315d1SAntonio Frighetto; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]]) 298241848b9SAntonio Frighetto; CHECK-NEXT: ret i1 true 299681315d1SAntonio Frighetto; 300681315d1SAntonio Frighetto %a_non_neg = icmp sge i8 %a, 0 301681315d1SAntonio Frighetto call void @llvm.assume(i1 %a_non_neg) 302681315d1SAntonio Frighetto %a_ugt_b = icmp uge i8 %a, %b 303681315d1SAntonio Frighetto call void @llvm.assume(i1 %a_ugt_b) 304681315d1SAntonio Frighetto 305681315d1SAntonio Frighetto %result = icmp sge i8 %a, %b 306681315d1SAntonio Frighetto 307681315d1SAntonio Frighetto ret i1 %result 308681315d1SAntonio Frighetto} 309681315d1SAntonio Frighetto 310681315d1SAntonio Frighettodefine i1 @ugt_assumed_positive_values(i8 %a, i8 %b) { 311681315d1SAntonio Frighetto; CHECK-LABEL: @ugt_assumed_positive_values( 312681315d1SAntonio Frighetto; CHECK-NEXT: [[A_NON_NEG:%.*]] = icmp sge i8 [[A:%.*]], 0 313681315d1SAntonio Frighetto; CHECK-NEXT: call void @llvm.assume(i1 [[A_NON_NEG]]) 314681315d1SAntonio Frighetto; CHECK-NEXT: [[A_UGT_B:%.*]] = icmp ugt i8 [[A]], [[B:%.*]] 315681315d1SAntonio Frighetto; CHECK-NEXT: call void @llvm.assume(i1 [[A_UGT_B]]) 316241848b9SAntonio Frighetto; CHECK-NEXT: ret i1 true 317681315d1SAntonio Frighetto; 318681315d1SAntonio Frighetto %a_non_neg = icmp sge i8 %a, 0 319681315d1SAntonio Frighetto call void @llvm.assume(i1 %a_non_neg) 320681315d1SAntonio Frighetto %a_ugt_b = icmp ugt i8 %a, %b 321681315d1SAntonio Frighetto call void @llvm.assume(i1 %a_ugt_b) 322681315d1SAntonio Frighetto 323681315d1SAntonio Frighetto %result = icmp sgt i8 %a, %b 324681315d1SAntonio Frighetto 325681315d1SAntonio Frighetto ret i1 %result 326681315d1SAntonio Frighetto} 327681315d1SAntonio Frighetto 328681315d1SAntonio Frighettodeclare void @llvm.assume(i1) 329