97 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=m68k-linux -verify-machineinstrs | FileCheck %s3 4declare i32 @printf(ptr, ...) nounwind5declare {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: ; %entry14; CHECK-NEXT: suba.l #12, %sp15; CHECK-NEXT: move.l (16,%sp), %d016; CHECK-NEXT: sub.l (20,%sp), %d017; CHECK-NEXT: bvc .LBB0_118; CHECK-NEXT: ; %bb.2: ; %overflow19; CHECK-NEXT: lea (no,%pc), %a020; CHECK-NEXT: move.l %a0, (%sp)21; CHECK-NEXT: jsr printf22; CHECK-NEXT: moveq #0, %d023; CHECK-NEXT: adda.l #12, %sp24; CHECK-NEXT: rts25; CHECK-NEXT: .LBB0_1: ; %normal26; CHECK-NEXT: move.l %d0, (4,%sp)27; CHECK-NEXT: lea (ok,%pc), %a028; CHECK-NEXT: move.l %a0, (%sp)29; CHECK-NEXT: jsr printf30; CHECK-NEXT: moveq #1, %d031; CHECK-NEXT: adda.l #12, %sp32; CHECK-NEXT: rts33entry:34 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)35 %sum = extractvalue {i32, i1} %t, 036 %obit = extractvalue {i32, i1} %t, 137 br i1 %obit, label %overflow, label %normal38 39normal:40 %t1 = tail call i32 (ptr, ...) @printf( ptr @ok, i32 %sum ) nounwind41 ret i1 true42 43overflow:44 %t2 = tail call i32 (ptr, ...) @printf( ptr @no ) nounwind45 ret i1 false46}47 48define i1 @func2(i32 %v1, i32 %v2) nounwind {49; CHECK-LABEL: func2:50; CHECK: ; %bb.0: ; %entry51; CHECK-NEXT: suba.l #12, %sp52; CHECK-NEXT: move.l (16,%sp), %d053; CHECK-NEXT: sub.l (20,%sp), %d054; CHECK-NEXT: bcc .LBB1_155; CHECK-NEXT: ; %bb.2: ; %carry56; CHECK-NEXT: lea (no,%pc), %a057; CHECK-NEXT: move.l %a0, (%sp)58; CHECK-NEXT: jsr printf59; CHECK-NEXT: moveq #0, %d060; CHECK-NEXT: adda.l #12, %sp61; CHECK-NEXT: rts62; CHECK-NEXT: .LBB1_1: ; %normal63; CHECK-NEXT: move.l %d0, (4,%sp)64; CHECK-NEXT: lea (ok,%pc), %a065; CHECK-NEXT: move.l %a0, (%sp)66; CHECK-NEXT: jsr printf67; CHECK-NEXT: moveq #1, %d068; CHECK-NEXT: adda.l #12, %sp69; CHECK-NEXT: rts70entry:71 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)72 %sum = extractvalue {i32, i1} %t, 073 %obit = extractvalue {i32, i1} %t, 174 br i1 %obit, label %carry, label %normal75 76normal:77 %t1 = tail call i32 (ptr, ...) @printf( ptr @ok, i32 %sum ) nounwind78 ret i1 true79 80carry:81 %t2 = tail call i32 (ptr, ...) @printf( ptr @no ) nounwind82 ret i1 false83}84 85define i1 @func3(i32 %x) nounwind {86; CHECK-LABEL: func3:87; CHECK: ; %bb.0: ; %entry88; CHECK-NEXT: moveq #-1, %d089; CHECK-NEXT: add.l (4,%sp), %d090; CHECK-NEXT: svs %d091; CHECK-NEXT: rts92entry:93 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %x, i32 1)94 %obit = extractvalue {i32, i1} %t, 195 ret i1 %obit96}97