1aac6629fSZain Jaffal; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2aac6629fSZain Jaffal; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3aac6629fSZain Jaffal 4aac6629fSZain Jaffaldeclare { i8, i1 } @llvm.usub.with.overflow.i8(i8, i8) 5aac6629fSZain Jaffal 6aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_cmp_condition(i8 %a, i8 %b) { 7aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_cmp_condition( 8aac6629fSZain Jaffal; CHECK-NEXT: entry: 9aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[A:%.*]] 10aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[C_1]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]] 11aac6629fSZain Jaffal; CHECK: math: 12aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 13aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 14aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 15aac6629fSZain Jaffal; CHECK: exit.ok: 16aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 17aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 18aac6629fSZain Jaffal; CHECK: exit.fail: 19aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 20aac6629fSZain Jaffal; 21aac6629fSZain Jaffalentry: 22aac6629fSZain Jaffal %c.1 = icmp uge i8 %b, %a 23aac6629fSZain Jaffal br i1 %c.1, label %math, label %exit.fail 24aac6629fSZain Jaffal 25aac6629fSZain Jaffalmath: 26aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 27aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 28aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 29aac6629fSZain Jaffal 30aac6629fSZain Jaffalexit.ok: 31aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 32aac6629fSZain Jaffal ret i8 %res 33aac6629fSZain Jaffal 34aac6629fSZain Jaffalexit.fail: 35aac6629fSZain Jaffal ret i8 0 36aac6629fSZain Jaffal} 37aac6629fSZain Jaffal 38aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_cmp_condition2(i8 %a, i8 %b) { 39aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_cmp_condition2( 40aac6629fSZain Jaffal; CHECK-NEXT: entry: 41aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]] 42aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]] 43aac6629fSZain Jaffal; CHECK: math: 44aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 45aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 46aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 47aac6629fSZain Jaffal; CHECK: exit.ok: 48aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 49aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 50aac6629fSZain Jaffal; CHECK: exit.fail: 51aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 52aac6629fSZain Jaffal; 53aac6629fSZain Jaffalentry: 54aac6629fSZain Jaffal %c.1 = icmp ule i8 %b, %a 55aac6629fSZain Jaffal br i1 %c.1, label %exit.fail, label %math 56aac6629fSZain Jaffal 57aac6629fSZain Jaffalmath: 58aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 59aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 60aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 61aac6629fSZain Jaffal 62aac6629fSZain Jaffalexit.ok: 63aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 64aac6629fSZain Jaffal ret i8 %res 65aac6629fSZain Jaffal 66aac6629fSZain Jaffalexit.fail: 67aac6629fSZain Jaffal ret i8 0 68aac6629fSZain Jaffal} 69aac6629fSZain Jaffal 70aac6629fSZain Jaffaldeclare void @use_res({ i8, i1 }) 71aac6629fSZain Jaffal 72aac6629fSZain Jaffaldefine i8 @sub_no_overflow_due_to_cmp_condition_result_used(i8 %a, i8 %b) { 73aac6629fSZain Jaffal; CHECK-LABEL: @sub_no_overflow_due_to_cmp_condition_result_used( 74aac6629fSZain Jaffal; CHECK-NEXT: entry: 75aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]] 76aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]] 77aac6629fSZain Jaffal; CHECK: math: 78aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 79aac6629fSZain Jaffal; CHECK-NEXT: call void @use_res({ i8, i1 } [[OP]]) 80aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 81aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 82aac6629fSZain Jaffal; CHECK: exit.ok: 83aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 84aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 85aac6629fSZain Jaffal; CHECK: exit.fail: 86aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 87aac6629fSZain Jaffal; 88aac6629fSZain Jaffalentry: 89aac6629fSZain Jaffal %c.1 = icmp ule i8 %b, %a 90aac6629fSZain Jaffal br i1 %c.1, label %exit.fail, label %math 91aac6629fSZain Jaffal 92aac6629fSZain Jaffalmath: 93aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 94aac6629fSZain Jaffal call void @use_res({ i8, i1 } %op) 95aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 96aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 97aac6629fSZain Jaffal 98aac6629fSZain Jaffalexit.ok: 99aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 100aac6629fSZain Jaffal ret i8 %res 101aac6629fSZain Jaffal 102aac6629fSZain Jaffalexit.fail: 103aac6629fSZain Jaffal ret i8 0 104aac6629fSZain Jaffal} 105aac6629fSZain Jaffal 106aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_or_conds(i8 %a, i8 %b) { 107aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_or_conds( 108aac6629fSZain Jaffal; CHECK-NEXT: entry: 109aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]] 110aac6629fSZain Jaffal; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[A]], 0 111aac6629fSZain Jaffal; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_2]], [[C_1]] 112aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[OR]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]] 113aac6629fSZain Jaffal; CHECK: math: 114aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 115aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 116aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 117aac6629fSZain Jaffal; CHECK: exit.ok: 118aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 119aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 120aac6629fSZain Jaffal; CHECK: exit.fail: 121aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 122aac6629fSZain Jaffal; 123aac6629fSZain Jaffalentry: 124aac6629fSZain Jaffal %c.1 = icmp ule i8 %b, %a 125aac6629fSZain Jaffal %c.2 = icmp ule i8 %a, 0 126aac6629fSZain Jaffal %or = or i1 %c.2, %c.1 127aac6629fSZain Jaffal br i1 %or, label %exit.fail, label %math 128aac6629fSZain Jaffal 129aac6629fSZain Jaffalmath: 130aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 131aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 132aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 133aac6629fSZain Jaffal 134aac6629fSZain Jaffalexit.ok: 135aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 136aac6629fSZain Jaffal ret i8 %res 137aac6629fSZain Jaffal 138aac6629fSZain Jaffalexit.fail: 139aac6629fSZain Jaffal ret i8 0 140aac6629fSZain Jaffal} 141aac6629fSZain Jaffal 142aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_or_conds_sub_result_not_used(i8 %a, i8 %b) { 143aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_or_conds_sub_result_not_used( 144aac6629fSZain Jaffal; CHECK-NEXT: entry: 145aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[B:%.*]], [[A:%.*]] 146aac6629fSZain Jaffal; CHECK-NEXT: [[C_2:%.*]] = icmp ule i8 [[A]], 0 147aac6629fSZain Jaffal; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_2]], [[C_1]] 148aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[OR]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]] 149aac6629fSZain Jaffal; CHECK: math: 150aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 151aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 152aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 153aac6629fSZain Jaffal; CHECK: exit.ok: 154aac6629fSZain Jaffal; CHECK-NEXT: ret i8 20 155aac6629fSZain Jaffal; CHECK: exit.fail: 156aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 157aac6629fSZain Jaffal; 158aac6629fSZain Jaffalentry: 159aac6629fSZain Jaffal %c.1 = icmp ule i8 %b, %a 160aac6629fSZain Jaffal %c.2 = icmp ule i8 %a, 0 161aac6629fSZain Jaffal %or = or i1 %c.2, %c.1 162aac6629fSZain Jaffal br i1 %or, label %exit.fail, label %math 163aac6629fSZain Jaffal 164aac6629fSZain Jaffalmath: 165aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 166aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 167aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 168aac6629fSZain Jaffal 169aac6629fSZain Jaffalexit.ok: 170aac6629fSZain Jaffal ret i8 20 171aac6629fSZain Jaffal 172aac6629fSZain Jaffalexit.fail: 173aac6629fSZain Jaffal ret i8 0 174aac6629fSZain Jaffal} 175aac6629fSZain Jaffal 176aac6629fSZain Jaffaldefine i8 @usub_no_overflow_due_to_and_conds(i8 %a, i8 %b) { 177aac6629fSZain Jaffal; CHECK-LABEL: @usub_no_overflow_due_to_and_conds( 178aac6629fSZain Jaffal; CHECK-NEXT: entry: 179aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[B:%.*]], [[A:%.*]] 180aac6629fSZain Jaffal; CHECK-NEXT: [[C_2:%.*]] = icmp uge i8 [[A]], -1 181aac6629fSZain Jaffal; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_2]], [[C_1]] 182aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[AND]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]] 183aac6629fSZain Jaffal; CHECK: math: 184aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 185aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 186aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 187aac6629fSZain Jaffal; CHECK: exit.ok: 188aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 189aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 190aac6629fSZain Jaffal; CHECK: exit.fail: 191aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 192aac6629fSZain Jaffal; 193aac6629fSZain Jaffalentry: 194aac6629fSZain Jaffal %c.1 = icmp uge i8 %b, %a 195aac6629fSZain Jaffal %c.2 = icmp uge i8 %a, -1 196aac6629fSZain Jaffal %and = and i1 %c.2, %c.1 197aac6629fSZain Jaffal br i1 %and, label %math, label %exit.fail 198aac6629fSZain Jaffal 199aac6629fSZain Jaffalmath: 200aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 201aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 202aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 203aac6629fSZain Jaffal 204aac6629fSZain Jaffalexit.ok: 205aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 206aac6629fSZain Jaffal ret i8 %res 207aac6629fSZain Jaffal 208aac6629fSZain Jaffalexit.fail: 209aac6629fSZain Jaffal ret i8 0 210aac6629fSZain Jaffal} 211aac6629fSZain Jaffal 212aac6629fSZain Jaffaldefine i8 @usub_may_overflow1(i8 %a, i8 %b) { 213aac6629fSZain Jaffal; CHECK-LABEL: @usub_may_overflow1( 214aac6629fSZain Jaffal; CHECK-NEXT: entry: 215*98e016d9SFlorian Hahn; CHECK-NEXT: br i1 true, label [[MATH:%.*]], label [[EXIT_FAIL:%.*]] 216aac6629fSZain Jaffal; CHECK: math: 217*98e016d9SFlorian Hahn; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B:%.*]], i8 [[A:%.*]]) 218aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 219aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 220aac6629fSZain Jaffal; CHECK: exit.ok: 221aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 222aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 223aac6629fSZain Jaffal; CHECK: exit.fail: 224aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 225aac6629fSZain Jaffal; 226aac6629fSZain Jaffalentry: 227aac6629fSZain Jaffal %c.1 = icmp uge i8 %a, 0 228aac6629fSZain Jaffal br i1 %c.1, label %math, label %exit.fail 229aac6629fSZain Jaffal 230aac6629fSZain Jaffalmath: 231aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 232aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 233aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 234aac6629fSZain Jaffal 235aac6629fSZain Jaffalexit.ok: 236aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 237aac6629fSZain Jaffal ret i8 %res 238aac6629fSZain Jaffal 239aac6629fSZain Jaffalexit.fail: 240aac6629fSZain Jaffal ret i8 0 241aac6629fSZain Jaffal} 242aac6629fSZain Jaffal 243aac6629fSZain Jaffal 244aac6629fSZain Jaffaldefine i8 @usub_may_overflow2(i8 %a, i8 %b) { 245aac6629fSZain Jaffal; CHECK-LABEL: @usub_may_overflow2( 246aac6629fSZain Jaffal; CHECK-NEXT: entry: 247aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp sge i8 [[B:%.*]], [[A:%.*]] 248aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[C_1]], label [[MATH:%.*]], label [[EXIT_FAIL:%.*]] 249aac6629fSZain Jaffal; CHECK: math: 250aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 251aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 252aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 253aac6629fSZain Jaffal; CHECK: exit.ok: 254aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 255aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 256aac6629fSZain Jaffal; CHECK: exit.fail: 257aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 258aac6629fSZain Jaffal; 259aac6629fSZain Jaffalentry: 260aac6629fSZain Jaffal %c.1 = icmp sge i8 %b, %a 261aac6629fSZain Jaffal br i1 %c.1, label %math, label %exit.fail 262aac6629fSZain Jaffal 263aac6629fSZain Jaffalmath: 264aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 265aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 266aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 267aac6629fSZain Jaffal 268aac6629fSZain Jaffalexit.ok: 269aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 270aac6629fSZain Jaffal ret i8 %res 271aac6629fSZain Jaffal 272aac6629fSZain Jaffalexit.fail: 273aac6629fSZain Jaffal ret i8 0 274aac6629fSZain Jaffal} 275aac6629fSZain Jaffal 276aac6629fSZain Jaffaldefine i8 @usub_may_overflow3(i8 %a, i8 %b) { 277aac6629fSZain Jaffal; CHECK-LABEL: @usub_may_overflow3( 278aac6629fSZain Jaffal; CHECK-NEXT: entry: 279aac6629fSZain Jaffal; CHECK-NEXT: [[C_1:%.*]] = icmp slt i8 [[B:%.*]], [[A:%.*]] 280aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_FAIL:%.*]], label [[MATH:%.*]] 281aac6629fSZain Jaffal; CHECK: math: 282aac6629fSZain Jaffal; CHECK-NEXT: [[OP:%.*]] = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 [[B]], i8 [[A]]) 283aac6629fSZain Jaffal; CHECK-NEXT: [[STATUS:%.*]] = extractvalue { i8, i1 } [[OP]], 1 284aac6629fSZain Jaffal; CHECK-NEXT: br i1 [[STATUS]], label [[EXIT_FAIL]], label [[EXIT_OK:%.*]] 285aac6629fSZain Jaffal; CHECK: exit.ok: 286aac6629fSZain Jaffal; CHECK-NEXT: [[RES:%.*]] = extractvalue { i8, i1 } [[OP]], 0 287aac6629fSZain Jaffal; CHECK-NEXT: ret i8 [[RES]] 288aac6629fSZain Jaffal; CHECK: exit.fail: 289aac6629fSZain Jaffal; CHECK-NEXT: ret i8 0 290aac6629fSZain Jaffal; 291aac6629fSZain Jaffalentry: 292aac6629fSZain Jaffal %c.1 = icmp slt i8 %b, %a 293aac6629fSZain Jaffal br i1 %c.1, label %exit.fail, label %math 294aac6629fSZain Jaffalmath: 295aac6629fSZain Jaffal %op = tail call { i8, i1 } @llvm.usub.with.overflow.i8(i8 %b, i8 %a) 296aac6629fSZain Jaffal %status = extractvalue { i8, i1 } %op, 1 297aac6629fSZain Jaffal br i1 %status, label %exit.fail, label %exit.ok 298aac6629fSZain Jaffal 299aac6629fSZain Jaffalexit.ok: 300aac6629fSZain Jaffal %res = extractvalue { i8, i1 } %op, 0 301aac6629fSZain Jaffal ret i8 %res 302aac6629fSZain Jaffal 303aac6629fSZain Jaffalexit.fail: 304aac6629fSZain Jaffal ret i8 0 305aac6629fSZain Jaffal} 306aac6629fSZain Jaffal 307