blob: 7c2e247c8740f3daeb75f66a2f385c275b9288fa [file] [log] [blame]
Benjamin Kramera0962762011-05-21 18:31:48 +00001; RUN: llc < %s -march=x86 | FileCheck %s
Bill Wendlingd350e022008-12-12 21:15:41 +00002
3@ok = internal constant [4 x i8] c"%d\0A\00"
4@no = internal constant [4 x i8] c"no\0A\00"
5
Benjamin Kramera0962762011-05-21 18:31:48 +00006define i1 @test1(i32 %v1, i32 %v2) nounwind {
Bill Wendlingd350e022008-12-12 21:15:41 +00007entry:
8 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
9 %sum = extractvalue {i32, i1} %t, 0
10 %obit = extractvalue {i32, i1} %t, 1
11 br i1 %obit, label %overflow, label %normal
12
13normal:
14 %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
15 ret i1 true
16
17overflow:
18 %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @no, i32 0, i32 0) ) nounwind
19 ret i1 false
Benjamin Kramera0962762011-05-21 18:31:48 +000020; CHECK: test1:
21; CHECK: imull
22; CHECK-NEXT: jo
23}
24
25define i1 @test2(i32 %v1, i32 %v2) nounwind {
26entry:
27 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)
28 %sum = extractvalue {i32, i1} %t, 0
29 %obit = extractvalue {i32, i1} %t, 1
30 br i1 %obit, label %overflow, label %normal
31
32overflow:
33 %t2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @no, i32 0, i32 0) ) nounwind
34 ret i1 false
35
36normal:
37 %t1 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @ok, i32 0, i32 0), i32 %sum ) nounwind
38 ret i1 true
39; CHECK: test2:
40; CHECK: imull
41; CHECK-NEXT: jno
Bill Wendlingd350e022008-12-12 21:15:41 +000042}
43
44declare i32 @printf(i8*, ...) nounwind
45declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32)
Benjamin Kramera0962762011-05-21 18:31:48 +000046
47define i32 @test3(i32 %a, i32 %b) nounwind readnone {
48entry:
49 %tmp0 = add i32 %b, %a
50 %tmp1 = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %tmp0, i32 2)
51 %tmp2 = extractvalue { i32, i1 } %tmp1, 0
52 ret i32 %tmp2
53; CHECK: test3:
54; CHECK: addl
55; CHECK-NEXT: addl
56; CHECK-NEXT: ret
57}
58
59define i32 @test4(i32 %a, i32 %b) nounwind readnone {
60entry:
61 %tmp0 = add i32 %b, %a
62 %tmp1 = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %tmp0, i32 4)
63 %tmp2 = extractvalue { i32, i1 } %tmp1, 0
64 ret i32 %tmp2
65; CHECK: test4:
66; CHECK: addl
67; CHECK: mull
68; CHECK-NEXT: ret
69}