Add a test for the 'init' option property.
[oota-llvm.git] / test / Transforms / InstCombine / intrinsics.ll
1 ; RUN: opt %s -instcombine -S | FileCheck %s
2
3 %overflow.result = type {i8, i1}
4
5 declare %overflow.result @llvm.uadd.with.overflow.i8(i8, i8)
6 declare %overflow.result @llvm.umul.with.overflow.i8(i8, i8)
7
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
11   ret i8 %y
12 ; CHECK: @test1
13 ; CHECK-NEXT: %y = add i8 %A, %B
14 ; CHECK-NEXT: ret i8 %y
15 }
16
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
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
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
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
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
54   ret i8 %y
55 ; CHECK: @test4
56 ; CHECK-NEXT: ret i8 undef
57 }
58
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
64   ret i8 %y
65 ; CHECK: @test5
66 ; CHECK-NEXT: store i1 false, i1* %overflowPtr
67 ; CHECK-NEXT: ret i8 0
68 }
69
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
75   ret i8 %y
76 ; CHECK: @test6
77 ; CHECK-NEXT: store i1 false, i1* %overflowPtr
78 ; CHECK-NEXT: ret i8 %A
79 }