blob: fda4386e9439e0b99e69a375834743dc523f6588 [file] [log] [blame]
Chris Lattner39c07b22009-11-09 07:07:56 +00001; RUN: opt %s -instcombine -S | FileCheck %s
2
Chris Lattner1cc4cca2009-11-29 02:57:29 +00003%overflow.result = type {i8, i1}
4
5declare %overflow.result @llvm.uadd.with.overflow.i8(i8, i8)
6declare %overflow.result @llvm.umul.with.overflow.i8(i8, i8)
Chris Lattner39c07b22009-11-09 07:07:56 +00007
8define i8 @test1(i8 %A, i8 %B) {
Chris Lattner1cc4cca2009-11-29 02:57:29 +00009 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
10 %y = extractvalue %overflow.result %x, 0
Chris Lattner39c07b22009-11-09 07:07:56 +000011 ret i8 %y
12; CHECK: @test1
13; CHECK-NEXT: %y = add i8 %A, %B
14; CHECK-NEXT: ret i8 %y
15}
Chris Lattner1cc4cca2009-11-29 02:57:29 +000016
17define i8 @test2(i8 %A, i8 %B, i1* %overflowPtr) {
18 %and.A = and i8 %A, 127
19 %and.B = and i8 %B, 127
20 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %and.A, i8 %and.B)
21 %y = extractvalue %overflow.result %x, 0
22 %z = extractvalue %overflow.result %x, 1
23 store i1 %z, i1* %overflowPtr
24 ret i8 %y
25; CHECK: @test2
26; CHECK-NEXT: %and.A = and i8 %A, 127
27; CHECK-NEXT: %and.B = and i8 %B, 127
28; CHECK-NEXT: %1 = add nuw i8 %and.A, %and.B
29; CHECK-NEXT: store i1 false, i1* %overflowPtr
30; CHECK-NEXT: ret i8 %1
31}
32
33define i8 @test3(i8 %A, i8 %B, i1* %overflowPtr) {
34 %or.A = or i8 %A, -128
35 %or.B = or i8 %B, -128
36 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %or.A, i8 %or.B)
37 %y = extractvalue %overflow.result %x, 0
38 %z = extractvalue %overflow.result %x, 1
39 store i1 %z, i1* %overflowPtr
40 ret i8 %y
41; CHECK: @test3
42; CHECK-NEXT: %or.A = or i8 %A, -128
43; CHECK-NEXT: %or.B = or i8 %B, -128
44; CHECK-NEXT: %1 = add i8 %or.A, %or.B
45; CHECK-NEXT: store i1 true, i1* %overflowPtr
46; CHECK-NEXT: ret i8 %1
47}
48
49define i8 @test4(i8 %A, i1* %overflowPtr) {
50 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 undef, i8 %A)
51 %y = extractvalue %overflow.result %x, 0
52 %z = extractvalue %overflow.result %x, 1
53 store i1 %z, i1* %overflowPtr
54 ret i8 %y
55; CHECK: @test4
56; CHECK-NEXT: ret i8 undef
57}
58
59define i8 @test5(i8 %A, i1* %overflowPtr) {
60 %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 0, i8 %A)
61 %y = extractvalue %overflow.result %x, 0
62 %z = extractvalue %overflow.result %x, 1
63 store i1 %z, i1* %overflowPtr
64 ret i8 %y
65; CHECK: @test5
66; CHECK-NEXT: store i1 false, i1* %overflowPtr
67; CHECK-NEXT: ret i8 0
68}
69
70define i8 @test6(i8 %A, i1* %overflowPtr) {
71 %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 1, i8 %A)
72 %y = extractvalue %overflow.result %x, 0
73 %z = extractvalue %overflow.result %x, 1
74 store i1 %z, i1* %overflowPtr
75 ret i8 %y
76; CHECK: @test6
77; CHECK-NEXT: store i1 false, i1* %overflowPtr
78; CHECK-NEXT: ret i8 %A
79}