1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=m68k-linux -verify-machineinstrs | FileCheck %s 3 4declare i32 @printf(ptr, ...) nounwind 5declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) 6declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) 7 8@ok = internal constant [4 x i8] c"%d\0A\00" 9@no = internal constant [4 x i8] c"no\0A\00" 10 11define i1 @func1(i32 %v1, i32 %v2) nounwind { 12; CHECK-LABEL: func1: 13; CHECK: ; %bb.0: ; %entry 14; CHECK-NEXT: suba.l #12, %sp 15; CHECK-NEXT: move.l (16,%sp), %d0 16; CHECK-NEXT: sub.l (20,%sp), %d0 17; CHECK-NEXT: bvc .LBB0_1 18; CHECK-NEXT: ; %bb.2: ; %overflow 19; CHECK-NEXT: lea (no,%pc), %a0 20; CHECK-NEXT: move.l %a0, (%sp) 21; CHECK-NEXT: jsr printf 22; CHECK-NEXT: moveq #0, %d0 23; CHECK-NEXT: adda.l #12, %sp 24; CHECK-NEXT: rts 25; CHECK-NEXT: .LBB0_1: ; %normal 26; CHECK-NEXT: move.l %d0, (4,%sp) 27; CHECK-NEXT: lea (ok,%pc), %a0 28; CHECK-NEXT: move.l %a0, (%sp) 29; CHECK-NEXT: jsr printf 30; CHECK-NEXT: moveq #1, %d0 31; CHECK-NEXT: adda.l #12, %sp 32; CHECK-NEXT: rts 33entry: 34 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2) 35 %sum = extractvalue {i32, i1} %t, 0 36 %obit = extractvalue {i32, i1} %t, 1 37 br i1 %obit, label %overflow, label %normal 38 39normal: 40 %t1 = tail call i32 (ptr, ...) @printf( ptr @ok, i32 %sum ) nounwind 41 ret i1 true 42 43overflow: 44 %t2 = tail call i32 (ptr, ...) @printf( ptr @no ) nounwind 45 ret i1 false 46} 47 48define i1 @func2(i32 %v1, i32 %v2) nounwind { 49; CHECK-LABEL: func2: 50; CHECK: ; %bb.0: ; %entry 51; CHECK-NEXT: suba.l #12, %sp 52; CHECK-NEXT: move.l (16,%sp), %d0 53; CHECK-NEXT: sub.l (20,%sp), %d0 54; CHECK-NEXT: bcc .LBB1_1 55; CHECK-NEXT: ; %bb.2: ; %carry 56; CHECK-NEXT: lea (no,%pc), %a0 57; CHECK-NEXT: move.l %a0, (%sp) 58; CHECK-NEXT: jsr printf 59; CHECK-NEXT: moveq #0, %d0 60; CHECK-NEXT: adda.l #12, %sp 61; CHECK-NEXT: rts 62; CHECK-NEXT: .LBB1_1: ; %normal 63; CHECK-NEXT: move.l %d0, (4,%sp) 64; CHECK-NEXT: lea (ok,%pc), %a0 65; CHECK-NEXT: move.l %a0, (%sp) 66; CHECK-NEXT: jsr printf 67; CHECK-NEXT: moveq #1, %d0 68; CHECK-NEXT: adda.l #12, %sp 69; CHECK-NEXT: rts 70entry: 71 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2) 72 %sum = extractvalue {i32, i1} %t, 0 73 %obit = extractvalue {i32, i1} %t, 1 74 br i1 %obit, label %carry, label %normal 75 76normal: 77 %t1 = tail call i32 (ptr, ...) @printf( ptr @ok, i32 %sum ) nounwind 78 ret i1 true 79 80carry: 81 %t2 = tail call i32 (ptr, ...) @printf( ptr @no ) nounwind 82 ret i1 false 83} 84 85define i1 @func3(i32 %x) nounwind { 86; CHECK-LABEL: func3: 87; CHECK: ; %bb.0: ; %entry 88; CHECK-NEXT: moveq #-1, %d0 89; CHECK-NEXT: add.l (4,%sp), %d0 90; CHECK-NEXT: svs %d0 91; CHECK-NEXT: rts 92entry: 93 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %x, i32 1) 94 %obit = extractvalue {i32, i1} %t, 1 95 ret i1 %obit 96} 97