blob: 89d4238101540d59d51363ed718f8d17e3da2498 [file] [log] [blame]
Chandler Carruthf6182152012-12-28 14:23:29 +00001; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3declare {i8, i1} @llvm.uadd.with.overflow.i8(i8 %a, i8 %b)
4
5define i1 @test_uadd1() {
Stephen Linc1c7a132013-07-14 01:42:54 +00006; CHECK-LABEL: @test_uadd1(
Chandler Carruthf6182152012-12-28 14:23:29 +00007 %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 3)
8 %overflow = extractvalue {i8, i1} %x, 1
9 ret i1 %overflow
10; CHECK-NEXT: ret i1 true
11}
12
13define i8 @test_uadd2() {
Stephen Linc1c7a132013-07-14 01:42:54 +000014; CHECK-LABEL: @test_uadd2(
Chandler Carruthf6182152012-12-28 14:23:29 +000015 %x = call {i8, i1} @llvm.uadd.with.overflow.i8(i8 254, i8 44)
16 %result = extractvalue {i8, i1} %x, 0
17 ret i8 %result
18; CHECK-NEXT: ret i8 42
19}
20
21declare i256 @llvm.cttz.i256(i256 %src, i1 %is_zero_undef)
22
23define i256 @test_cttz() {
Stephen Linc1c7a132013-07-14 01:42:54 +000024; CHECK-LABEL: @test_cttz(
Chandler Carruthf6182152012-12-28 14:23:29 +000025 %x = call i256 @llvm.cttz.i256(i256 10, i1 false)
26 ret i256 %x
27; CHECK-NEXT: ret i256 1
28}
29
30declare i256 @llvm.ctpop.i256(i256 %src)
31
32define i256 @test_ctpop() {
Stephen Linc1c7a132013-07-14 01:42:54 +000033; CHECK-LABEL: @test_ctpop(
Chandler Carruthf6182152012-12-28 14:23:29 +000034 %x = call i256 @llvm.ctpop.i256(i256 10)
35 ret i256 %x
36; CHECK-NEXT: ret i256 2
37}
38
39; Test a non-intrinsic that we know about as a library call.
40declare float @fabs(float %x)
41
42define float @test_fabs_libcall() {
Stephen Linc1c7a132013-07-14 01:42:54 +000043; CHECK-LABEL: @test_fabs_libcall(
Chandler Carruthf6182152012-12-28 14:23:29 +000044
45 %x = call float @fabs(float -42.0)
46; This is still a real function call, so instsimplify won't nuke it -- other
47; passes have to do that.
48; CHECK-NEXT: call float @fabs
49
50 ret float %x
51; CHECK-NEXT: ret float 4.2{{0+}}e+01
52}
Michael Ilseman54857292013-02-07 19:26:05 +000053
54
55declare float @llvm.fabs.f32(float) nounwind readnone
56declare float @llvm.floor.f32(float) nounwind readnone
57declare float @llvm.ceil.f32(float) nounwind readnone
58declare float @llvm.trunc.f32(float) nounwind readnone
59declare float @llvm.rint.f32(float) nounwind readnone
60declare float @llvm.nearbyint.f32(float) nounwind readnone
61
62; Test idempotent intrinsics
63define float @test_idempotence(float %a) {
Stephen Linc1c7a132013-07-14 01:42:54 +000064; CHECK-LABEL: @test_idempotence(
Michael Ilseman54857292013-02-07 19:26:05 +000065
66; CHECK: fabs
67; CHECK-NOT: fabs
68 %a0 = call float @llvm.fabs.f32(float %a)
69 %a1 = call float @llvm.fabs.f32(float %a0)
70
71; CHECK: floor
72; CHECK-NOT: floor
73 %b0 = call float @llvm.floor.f32(float %a)
74 %b1 = call float @llvm.floor.f32(float %b0)
75
76; CHECK: ceil
77; CHECK-NOT: ceil
78 %c0 = call float @llvm.ceil.f32(float %a)
79 %c1 = call float @llvm.ceil.f32(float %c0)
80
81; CHECK: trunc
82; CHECK-NOT: trunc
83 %d0 = call float @llvm.trunc.f32(float %a)
84 %d1 = call float @llvm.trunc.f32(float %d0)
85
86; CHECK: rint
87; CHECK-NOT: rint
88 %e0 = call float @llvm.rint.f32(float %a)
89 %e1 = call float @llvm.rint.f32(float %e0)
90
91; CHECK: nearbyint
92; CHECK-NOT: nearbyint
93 %f0 = call float @llvm.nearbyint.f32(float %a)
94 %f1 = call float @llvm.nearbyint.f32(float %f0)
95
96 %r0 = fadd float %a1, %b1
97 %r1 = fadd float %r0, %c1
98 %r2 = fadd float %r1, %d1
99 %r3 = fadd float %r2, %e1
100 %r4 = fadd float %r3, %f1
101
102 ret float %r4
103}
Benjamin Kramerfd4777c2013-09-24 16:37:51 +0000104
105define i8* @operator_new() {
106entry:
107 %call = tail call noalias i8* @_Znwm(i64 8)
108 %cmp = icmp eq i8* %call, null
109 br i1 %cmp, label %cast.end, label %cast.notnull
110
111cast.notnull: ; preds = %entry
112 %add.ptr = getelementptr inbounds i8* %call, i64 4
113 br label %cast.end
114
115cast.end: ; preds = %cast.notnull, %entry
116 %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
117 ret i8* %cast.result
118
119; CHECK-LABEL: @operator_new
120; CHECK: br i1 false, label %cast.end, label %cast.notnull
121}
122
123declare noalias i8* @_Znwm(i64)
Benjamin Kramer4d4df042013-09-24 17:15:14 +0000124
125define i8* @malloc_can_return_null() {
126entry:
127 %call = tail call noalias i8* @malloc(i64 8)
128 %cmp = icmp eq i8* %call, null
129 br i1 %cmp, label %cast.end, label %cast.notnull
130
131cast.notnull: ; preds = %entry
132 %add.ptr = getelementptr inbounds i8* %call, i64 4
133 br label %cast.end
134
135cast.end: ; preds = %cast.notnull, %entry
136 %cast.result = phi i8* [ %add.ptr, %cast.notnull ], [ null, %entry ]
137 ret i8* %cast.result
138
139; CHECK-LABEL: @malloc_can_return_null
140; CHECK: br i1 %cmp, label %cast.end, label %cast.notnull
141}
142
143declare noalias i8* @malloc(i64)