Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/cast_ptr.ll @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 60c9769439b8 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
1 ; Tests to make sure elimination of casts is working correctly | |
2 ; RUN: opt < %s -instcombine -S | FileCheck %s | |
3 | |
4 target datalayout = "p:32:32-p1:32:32-p2:16:16" | |
5 | |
6 ; This shouldn't convert to getelementptr because the relationship | |
7 ; between the arithmetic and the layout of allocated memory is | |
8 ; entirely unknown. | |
9 ; CHECK-LABEL: @test1( | |
10 ; CHECK: ptrtoint | |
11 ; CHECK: add | |
12 ; CHECK: inttoptr | |
13 define i8* @test1(i8* %t) { | |
14 %tmpc = ptrtoint i8* %t to i32 ; <i32> [#uses=1] | |
15 %tmpa = add i32 %tmpc, 32 ; <i32> [#uses=1] | |
16 %tv = inttoptr i32 %tmpa to i8* ; <i8*> [#uses=1] | |
17 ret i8* %tv | |
18 } | |
19 | |
20 ; These casts should be folded away. | |
21 ; CHECK-LABEL: @test2( | |
22 ; CHECK: icmp eq i8* %a, %b | |
23 define i1 @test2(i8* %a, i8* %b) { | |
24 %tmpa = ptrtoint i8* %a to i32 ; <i32> [#uses=1] | |
25 %tmpb = ptrtoint i8* %b to i32 ; <i32> [#uses=1] | |
26 %r = icmp eq i32 %tmpa, %tmpb ; <i1> [#uses=1] | |
27 ret i1 %r | |
28 } | |
29 | |
30 ; These casts should be folded away. | |
31 ; CHECK-LABEL: @test2_as2_same_int( | |
32 ; CHECK: icmp eq i8 addrspace(2)* %a, %b | |
33 define i1 @test2_as2_same_int(i8 addrspace(2)* %a, i8 addrspace(2)* %b) { | |
34 %tmpa = ptrtoint i8 addrspace(2)* %a to i16 | |
35 %tmpb = ptrtoint i8 addrspace(2)* %b to i16 | |
36 %r = icmp eq i16 %tmpa, %tmpb | |
37 ret i1 %r | |
38 } | |
39 | |
40 ; These casts should be folded away. | |
41 ; CHECK-LABEL: @test2_as2_larger( | |
42 ; CHECK: icmp eq i8 addrspace(2)* %a, %b | |
43 define i1 @test2_as2_larger(i8 addrspace(2)* %a, i8 addrspace(2)* %b) { | |
44 %tmpa = ptrtoint i8 addrspace(2)* %a to i32 | |
45 %tmpb = ptrtoint i8 addrspace(2)* %b to i32 | |
46 %r = icmp eq i32 %tmpa, %tmpb | |
47 ret i1 %r | |
48 } | |
49 | |
50 ; These casts should also be folded away. | |
51 ; CHECK-LABEL: @test3( | |
52 ; CHECK: icmp eq i8* %a, @global | |
53 @global = global i8 0 | |
54 define i1 @test3(i8* %a) { | |
55 %tmpa = ptrtoint i8* %a to i32 | |
56 %r = icmp eq i32 %tmpa, ptrtoint (i8* @global to i32) | |
57 ret i1 %r | |
58 } | |
59 | |
60 define i1 @test4(i32 %A) { | |
61 %B = inttoptr i32 %A to i8* | |
62 %C = icmp eq i8* %B, null | |
63 ret i1 %C | |
64 ; CHECK-LABEL: @test4( | |
65 ; CHECK-NEXT: %C = icmp eq i32 %A, 0 | |
66 ; CHECK-NEXT: ret i1 %C | |
67 } | |
68 | |
69 define i1 @test4_as2(i16 %A) { | |
70 ; CHECK-LABEL: @test4_as2( | |
71 ; CHECK-NEXT: %C = icmp eq i16 %A, 0 | |
72 ; CHECK-NEXT: ret i1 %C | |
73 %B = inttoptr i16 %A to i8 addrspace(2)* | |
74 %C = icmp eq i8 addrspace(2)* %B, null | |
75 ret i1 %C | |
76 } | |
77 | |
78 | |
79 ; Pulling the cast out of the load allows us to eliminate the load, and then | |
80 ; the whole array. | |
81 | |
82 %op = type { float } | |
83 %unop = type { i32 } | |
84 @Array = internal constant [1 x %op* (%op*)*] [ %op* (%op*)* @foo ] ; <[1 x %op* (%op*)*]*> [#uses=1] | |
85 | |
86 declare %op* @foo(%op* %X) | |
87 | |
88 define %unop* @test5(%op* %O) { | |
89 %tmp = load %unop* (%op*)** bitcast ([1 x %op* (%op*)*]* @Array to %unop* (%op*)**); <%unop* (%op*)*> [#uses=1] | |
90 %tmp.2 = call %unop* %tmp( %op* %O ) ; <%unop*> [#uses=1] | |
91 ret %unop* %tmp.2 | |
92 ; CHECK-LABEL: @test5( | |
93 ; CHECK: call %op* @foo(%op* %O) | |
94 } | |
95 | |
96 | |
97 | |
98 ; InstCombine can not 'load (cast P)' -> cast (load P)' if the cast changes | |
99 ; the address space. | |
100 | |
101 define i8 @test6(i8 addrspace(1)* %source) { | |
102 entry: | |
103 %arrayidx223 = addrspacecast i8 addrspace(1)* %source to i8* | |
104 %tmp4 = load i8* %arrayidx223 | |
105 ret i8 %tmp4 | |
106 ; CHECK-LABEL: @test6( | |
107 ; CHECK: load i8* %arrayidx223 | |
108 } |