OLD | NEW |
1 ; RUN: opt < %s -nacl-expand-tls-constant-expr -S | FileCheck %s | 1 ; RUN: opt < %s -nacl-expand-tls-constant-expr -S | FileCheck %s |
2 | 2 |
3 @tvar = thread_local global i32 0 | 3 @tvar = thread_local global i32 0 |
4 | 4 |
5 | 5 |
6 define i32 @test_converting_ptrtoint() { | 6 define i32 @test_converting_ptrtoint() { |
7 ret i32 ptrtoint (i32* @tvar to i32) | 7 ret i32 ptrtoint (i32* @tvar to i32) |
8 } | 8 } |
9 ; CHECK: define i32 @test_converting_ptrtoint() | 9 ; CHECK: define i32 @test_converting_ptrtoint() |
10 ; CHECK: %expanded = ptrtoint i32* @tvar to i32 | 10 ; CHECK: %expanded = ptrtoint i32* @tvar to i32 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 define i8* @test_converting_bitcast() { | 43 define i8* @test_converting_bitcast() { |
44 ret i8* bitcast (i32* @tvar to i8*) | 44 ret i8* bitcast (i32* @tvar to i8*) |
45 } | 45 } |
46 ; CHECK: define i8* @test_converting_bitcast() | 46 ; CHECK: define i8* @test_converting_bitcast() |
47 ; CHECK: %expanded = bitcast i32* @tvar to i8* | 47 ; CHECK: %expanded = bitcast i32* @tvar to i8* |
48 ; CHECK: ret i8* %expanded | 48 ; CHECK: ret i8* %expanded |
49 | 49 |
50 | 50 |
51 define i32* @test_converting_getelementptr() { | 51 define i32* @test_converting_getelementptr() { |
52 ; Use an index >1 to ensure that "inbounds" is not added automatically. | 52 ; Use an index >1 to ensure that "inbounds" is not added automatically. |
53 ret i32* getelementptr (i32* @tvar, i32 2) | 53 ret i32* getelementptr (i32, i32* @tvar, i32 2) |
54 } | 54 } |
55 ; CHECK: define i32* @test_converting_getelementptr() | 55 ; CHECK: define i32* @test_converting_getelementptr() |
56 ; CHECK: %expanded = getelementptr i32* @tvar, i32 2 | 56 ; CHECK: %expanded = getelementptr i32, i32* @tvar, i32 2 |
57 ; CHECK: ret i32* %expanded | 57 ; CHECK: ret i32* %expanded |
58 | 58 |
59 | 59 |
60 ; This is identical to @test_converting_getelementptr(). | 60 ; This is identical to @test_converting_getelementptr(). |
61 ; We need to check that both copies of getelementptr are fixed. | 61 ; We need to check that both copies of getelementptr are fixed. |
62 define i32* @test_converting_getelementptr_copy() { | 62 define i32* @test_converting_getelementptr_copy() { |
63 ret i32* getelementptr (i32* @tvar, i32 2) | 63 ret i32* getelementptr (i32, i32* @tvar, i32 2) |
64 } | 64 } |
65 ; CHECK: define i32* @test_converting_getelementptr_copy() | 65 ; CHECK: define i32* @test_converting_getelementptr_copy() |
66 ; CHECK: %expanded = getelementptr i32* @tvar, i32 2 | 66 ; CHECK: %expanded = getelementptr i32, i32* @tvar, i32 2 |
67 ; CHECK: ret i32* %expanded | 67 ; CHECK: ret i32* %expanded |
68 | 68 |
69 | 69 |
70 define i32* @test_converting_getelementptr_inbounds() { | 70 define i32* @test_converting_getelementptr_inbounds() { |
71 ret i32* getelementptr inbounds (i32* @tvar, i32 2) | 71 ret i32* getelementptr inbounds (i32, i32* @tvar, i32 2) |
72 } | 72 } |
73 ; CHECK: define i32* @test_converting_getelementptr_inbounds() | 73 ; CHECK: define i32* @test_converting_getelementptr_inbounds() |
74 ; CHECK: %expanded = getelementptr inbounds i32* @tvar, i32 2 | 74 ; CHECK: %expanded = getelementptr inbounds i32, i32* @tvar, i32 2 |
75 ; CHECK: ret i32* %expanded | 75 ; CHECK: ret i32* %expanded |
76 | 76 |
77 | 77 |
78 define i32* @test_converting_phi(i1 %cmp) { | 78 define i32* @test_converting_phi(i1 %cmp) { |
79 entry: | 79 entry: |
80 br i1 %cmp, label %return, label %else | 80 br i1 %cmp, label %return, label %else |
81 | 81 |
82 else: | 82 else: |
83 br label %return | 83 br label %return |
84 | 84 |
85 return: | 85 return: |
86 %result = phi i32* [ getelementptr (i32* @tvar, i32 1), %entry ], [ null, %els
e ] | 86 %result = phi i32* [ getelementptr (i32, i32* @tvar, i32 1), %entry ], [ null,
%else ] |
87 ret i32* %result | 87 ret i32* %result |
88 } | 88 } |
89 ; The converted ConstantExprs get pushed back into the PHI node's | 89 ; The converted ConstantExprs get pushed back into the PHI node's |
90 ; incoming block, which might be suboptimal but works in all cases. | 90 ; incoming block, which might be suboptimal but works in all cases. |
91 ; CHECK: define i32* @test_converting_phi(i1 %cmp) | 91 ; CHECK: define i32* @test_converting_phi(i1 %cmp) |
92 ; CHECK: entry: | 92 ; CHECK: entry: |
93 ; CHECK: %expanded = getelementptr inbounds i32* @tvar, i32 1 | 93 ; CHECK: %expanded = getelementptr inbounds i32, i32* @tvar, i32 1 |
94 ; CHECK: else: | 94 ; CHECK: else: |
95 ; CHECK: return: | 95 ; CHECK: return: |
96 ; CHECK: %result = phi i32* [ %expanded, %entry ], [ null, %else ] | 96 ; CHECK: %result = phi i32* [ %expanded, %entry ], [ null, %else ] |
97 | 97 |
98 | 98 |
99 @addr1 = global i8* blockaddress(@test_converting_phi_with_indirectbr, %return) | 99 @addr1 = global i8* blockaddress(@test_converting_phi_with_indirectbr, %return) |
100 @addr2 = global i8* blockaddress(@test_converting_phi_with_indirectbr, %else) | 100 @addr2 = global i8* blockaddress(@test_converting_phi_with_indirectbr, %else) |
101 define i32* @test_converting_phi_with_indirectbr(i8* %addr) { | 101 define i32* @test_converting_phi_with_indirectbr(i8* %addr) { |
102 entry: | 102 entry: |
103 indirectbr i8* %addr, [ label %return, label %else ] | 103 indirectbr i8* %addr, [ label %return, label %else ] |
104 | 104 |
105 else: | 105 else: |
106 br label %return | 106 br label %return |
107 | 107 |
108 return: | 108 return: |
109 %result = phi i32* [ getelementptr (i32* @tvar, i32 1), %entry ], [ null, %els
e ] | 109 %result = phi i32* [ getelementptr (i32, i32* @tvar, i32 1), %entry ], [ null,
%else ] |
110 ret i32* %result | 110 ret i32* %result |
111 } | 111 } |
112 ; CHECK: define i32* @test_converting_phi_with_indirectbr(i8* %addr) | 112 ; CHECK: define i32* @test_converting_phi_with_indirectbr(i8* %addr) |
113 ; CHECK: entry: | 113 ; CHECK: entry: |
114 ; CHECK: %expanded = getelementptr inbounds i32* @tvar, i32 1 | 114 ; CHECK: %expanded = getelementptr inbounds i32, i32* @tvar, i32 1 |
115 ; CHECK: return: | 115 ; CHECK: return: |
116 ; CHECK: %result = phi i32* [ %expanded, %entry ], [ null, %else ] | 116 ; CHECK: %result = phi i32* [ %expanded, %entry ], [ null, %else ] |
117 | 117 |
118 | 118 |
119 ; This tests that ExpandTlsConstantExpr correctly handles a PHI node | 119 ; This tests that ExpandTlsConstantExpr correctly handles a PHI node |
120 ; that contains the same ConstantExpr twice. Using | 120 ; that contains the same ConstantExpr twice. Using |
121 ; replaceAllUsesWith() is not correct on a PHI node when the new | 121 ; replaceAllUsesWith() is not correct on a PHI node when the new |
122 ; instruction has to be added to an incoming block. | 122 ; instruction has to be added to an incoming block. |
123 define i32 @test_converting_phi_twice(i1 %arg) { | 123 define i32 @test_converting_phi_twice(i1 %arg) { |
124 br i1 %arg, label %iftrue, label %iffalse | 124 br i1 %arg, label %iftrue, label %iffalse |
(...skipping 18 matching lines...) Expand all Loading... |
143 define i32 @test_converting_phi_multiple_entry(i1 %arg) { | 143 define i32 @test_converting_phi_multiple_entry(i1 %arg) { |
144 entry: | 144 entry: |
145 br i1 %arg, label %done, label %done | 145 br i1 %arg, label %done, label %done |
146 done: | 146 done: |
147 %result = phi i32 [ ptrtoint (i32* @tvar to i32), %entry ], | 147 %result = phi i32 [ ptrtoint (i32* @tvar to i32), %entry ], |
148 [ ptrtoint (i32* @tvar to i32), %entry ] | 148 [ ptrtoint (i32* @tvar to i32), %entry ] |
149 ret i32 %result | 149 ret i32 %result |
150 } | 150 } |
151 ; CHECK: define i32 @test_converting_phi_multiple_entry(i1 %arg) | 151 ; CHECK: define i32 @test_converting_phi_multiple_entry(i1 %arg) |
152 ; CHECK: %result = phi i32 [ %expanded, %entry ], [ %expanded, %entry ] | 152 ; CHECK: %result = phi i32 [ %expanded, %entry ], [ %expanded, %entry ] |
OLD | NEW |