blob: f899fc0ecd369d9514b715cbcbac7e004582f7e7 [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 Lattner8330daf2010-01-01 01:52:15 +00007declare double @llvm.powi.f64(double, i32) nounwind readonly
Chris Lattner9da1cb22010-01-05 07:23:56 +00008declare i32 @llvm.cttz.i32(i32) nounwind readnone
9declare i8 @llvm.ctlz.i8(i8) nounwind readnone
Chris Lattner39c07b22009-11-09 07:07:56 +000010
11define i8 @test1(i8 %A, i8 %B) {
Chris Lattner1cc4cca2009-11-29 02:57:29 +000012 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %A, i8 %B)
13 %y = extractvalue %overflow.result %x, 0
Chris Lattner39c07b22009-11-09 07:07:56 +000014 ret i8 %y
15; CHECK: @test1
16; CHECK-NEXT: %y = add i8 %A, %B
17; CHECK-NEXT: ret i8 %y
18}
Chris Lattner1cc4cca2009-11-29 02:57:29 +000019
20define i8 @test2(i8 %A, i8 %B, i1* %overflowPtr) {
21 %and.A = and i8 %A, 127
22 %and.B = and i8 %B, 127
23 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %and.A, i8 %and.B)
24 %y = extractvalue %overflow.result %x, 0
25 %z = extractvalue %overflow.result %x, 1
26 store i1 %z, i1* %overflowPtr
27 ret i8 %y
28; CHECK: @test2
29; CHECK-NEXT: %and.A = and i8 %A, 127
30; CHECK-NEXT: %and.B = and i8 %B, 127
31; CHECK-NEXT: %1 = add nuw i8 %and.A, %and.B
32; CHECK-NEXT: store i1 false, i1* %overflowPtr
33; CHECK-NEXT: ret i8 %1
34}
35
36define i8 @test3(i8 %A, i8 %B, i1* %overflowPtr) {
37 %or.A = or i8 %A, -128
38 %or.B = or i8 %B, -128
39 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 %or.A, i8 %or.B)
40 %y = extractvalue %overflow.result %x, 0
41 %z = extractvalue %overflow.result %x, 1
42 store i1 %z, i1* %overflowPtr
43 ret i8 %y
44; CHECK: @test3
45; CHECK-NEXT: %or.A = or i8 %A, -128
46; CHECK-NEXT: %or.B = or i8 %B, -128
47; CHECK-NEXT: %1 = add i8 %or.A, %or.B
48; CHECK-NEXT: store i1 true, i1* %overflowPtr
49; CHECK-NEXT: ret i8 %1
50}
51
52define i8 @test4(i8 %A, i1* %overflowPtr) {
53 %x = call %overflow.result @llvm.uadd.with.overflow.i8(i8 undef, i8 %A)
54 %y = extractvalue %overflow.result %x, 0
55 %z = extractvalue %overflow.result %x, 1
56 store i1 %z, i1* %overflowPtr
57 ret i8 %y
58; CHECK: @test4
59; CHECK-NEXT: ret i8 undef
60}
61
62define i8 @test5(i8 %A, i1* %overflowPtr) {
63 %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 0, i8 %A)
64 %y = extractvalue %overflow.result %x, 0
65 %z = extractvalue %overflow.result %x, 1
66 store i1 %z, i1* %overflowPtr
67 ret i8 %y
68; CHECK: @test5
69; CHECK-NEXT: store i1 false, i1* %overflowPtr
70; CHECK-NEXT: ret i8 0
71}
72
73define i8 @test6(i8 %A, i1* %overflowPtr) {
74 %x = call %overflow.result @llvm.umul.with.overflow.i8(i8 1, i8 %A)
75 %y = extractvalue %overflow.result %x, 0
76 %z = extractvalue %overflow.result %x, 1
77 store i1 %z, i1* %overflowPtr
78 ret i8 %y
79; CHECK: @test6
80; CHECK-NEXT: store i1 false, i1* %overflowPtr
81; CHECK-NEXT: ret i8 %A
82}
Chris Lattner8330daf2010-01-01 01:52:15 +000083
Chris Lattner8330daf2010-01-01 01:52:15 +000084define void @powi(double %V, double *%P) {
85entry:
86 %A = tail call double @llvm.powi.f64(double %V, i32 -1) nounwind
87 volatile store double %A, double* %P
88
89 %B = tail call double @llvm.powi.f64(double %V, i32 0) nounwind
90 volatile store double %B, double* %P
91
92 %C = tail call double @llvm.powi.f64(double %V, i32 1) nounwind
93 volatile store double %C, double* %P
94 ret void
95; CHECK: @powi
96; CHECK: %A = fdiv double 1.0{{.*}}, %V
97; CHECK: volatile store double %A,
98; CHECK: volatile store double 1.0
99; CHECK: volatile store double %V
100}
101
Chris Lattner9da1cb22010-01-05 07:23:56 +0000102define i32 @cttz(i32 %a)
103{
104entry:
105 %or = or i32 %a, 8
106 %and = and i32 %or, -8
107 %count = tail call i32 @llvm.cttz.i32(i32 %and) nounwind readnone
108 ret i32 %count
109; CHECK: @cttz
110; CHECK-NEXT: entry:
111; CHECK-NEXT: ret i32 3
112}
Chris Lattner8330daf2010-01-01 01:52:15 +0000113
Chris Lattner9da1cb22010-01-05 07:23:56 +0000114define i8 @ctlz(i8 %a)
115{
116entry:
117 %or = or i8 %a, 32
118 %and = and i8 %or, 63
119 %count = tail call i8 @llvm.ctlz.i8(i8 %and) nounwind readnone
120 ret i8 %count
121; CHECK: @ctlz
122; CHECK-NEXT: entry:
123; CHECK-NEXT: ret i8 2
124}