1 ; RUN: opt %s -instcombine -S | FileCheck %s
3 %overflow.result = type {i8, i1}
5 declare %overflow.result @llvm.uadd.with.overflow.i8(i8, i8)
6 declare %overflow.result @llvm.umul.with.overflow.i8(i8, i8)
8 define i8 @test1(i8 %A, i8 %B) {
9 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
10 %y = extractvalue %overflow.result %x, 0
13 ; CHECK-NEXT: %y = add i8 %A, %B
14 ; CHECK-NEXT: ret i8 %y
17 define 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
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
33 define 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
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
49 define 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
56 ; CHECK-NEXT: ret i8 undef
59 define 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
66 ; CHECK-NEXT: store i1 false, i1* %overflowPtr
67 ; CHECK-NEXT: ret i8 0
70 define 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
77 ; CHECK-NEXT: store i1 false, i1* %overflowPtr
78 ; CHECK-NEXT: ret i8 %A