blob: 4accb47af2ad047bb9eff3f893a8777765bf94ed [file] [log] [blame]
Chris Lattnerfa49f812002-05-02 17:01:39 +00001; Tests to make sure elimination of casts is working correctly
Chris Lattner23405aa2006-04-12 18:07:41 +00002; RUN: llvm-as < %s | opt -instcombine -disable-output &&
Reid Spencer3da59db2006-11-27 01:05:10 +00003; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep '%c' | notcast
Chris Lattnerfa49f812002-05-02 17:01:39 +00004
Chris Lattner0ca44182004-02-22 05:24:09 +00005%inbuf = external global [32832 x ubyte]
6
Chris Lattnerfa49f812002-05-02 17:01:39 +00007implementation
8
Chris Lattnerc7f96372002-08-02 18:48:09 +00009int %test1(int %A) {
Chris Lattnerfa49f812002-05-02 17:01:39 +000010 %c1 = cast int %A to uint
11 %c2 = cast uint %c1 to int
12 ret int %c2
Chris Lattnerc7f96372002-08-02 18:48:09 +000013}
Chris Lattnerfa49f812002-05-02 17:01:39 +000014
Chris Lattnerc7f96372002-08-02 18:48:09 +000015ulong %test2(ubyte %A) {
Chris Lattnerfa49f812002-05-02 17:01:39 +000016 %c1 = cast ubyte %A to ushort
17 %c2 = cast ushort %c1 to uint
18 %Ret = cast uint %c2 to ulong
19 ret ulong %Ret
Chris Lattnerc7f96372002-08-02 18:48:09 +000020}
21
22ulong %test3(ulong %A) { ; This function should just use bitwise AND
23 %c1 = cast ulong %A to ubyte
24 %c2 = cast ubyte %c1 to ulong
25 ret ulong %c2
26}
Chris Lattner8decbcb2002-08-15 16:13:29 +000027
28uint %test4(int %A, int %B) {
29 %COND = setlt int %A, %B
30 %c = cast bool %COND to ubyte ; Booleans are unsigned integrals
31 %result = cast ubyte %c to uint ; for the cast elim purpose
32 ret uint %result
33}
34
35int %test5(bool %B) {
36 %c = cast bool %B to ubyte ; This cast should get folded into
37 %result = cast ubyte %c to int ; this cast
38 ret int %result
39}
40
41int %test6(ulong %A) {
42 %c1 = cast ulong %A to uint
43 %res = cast uint %c1 to int
44 ret int %res
45}
46
47long %test7(bool %A) {
48 %c1 = cast bool %A to int
49 %res = cast int %c1 to long
50 ret long %res
51}
52
53long %test8(sbyte %A) {
54 %c1 = cast sbyte %A to ulong
55 %res = cast ulong %c1 to long
56 ret long %res
57}
58
Chris Lattnera30b70f2002-09-23 23:39:17 +000059short %test9(short %A) {
60 %c1 = cast short %A to int
61 %c2 = cast int %c1 to short
62 ret short %c2
63}
64
65short %test10(short %A) {
66 %c1 = cast short %A to uint
67 %c2 = cast uint %c1 to short
68 ret short %c2
69}
Chris Lattner8186a942003-06-23 21:48:26 +000070
Chris Lattnerd1c5ea12003-10-07 22:53:46 +000071declare void %varargs(int, ...)
72
73void %test11(int* %P) {
74 %c = cast int* %P to short*
75 call void(int, ...)* %varargs(int 5, short* %c)
76 ret void
77}
Chris Lattnerfc424c32003-11-02 05:56:58 +000078
79int* %test12() {
80 %p = malloc [4 x sbyte]
81 %c = cast [4 x sbyte]* %p to int*
82 ret int* %c
83}
Chris Lattner0ca44182004-02-22 05:24:09 +000084
Chris Lattner0ca44182004-02-22 05:24:09 +000085ubyte *%test13(long %A) {
86 %c = getelementptr [0 x ubyte]* cast ([32832 x ubyte]* %inbuf to [0 x ubyte]*), long 0, long %A
87 ret ubyte* %c
88}
Chris Lattner3c4de7f2004-02-23 07:16:03 +000089
90bool %test14(sbyte %A) {
Chris Lattner2e13cea2004-05-25 04:28:43 +000091 %c = cast sbyte %A to ubyte
92 %X = setlt ubyte %c, 128 ; setge %A, 0
Chris Lattner3c4de7f2004-02-23 07:16:03 +000093 ret bool %X
94}
95
96bool %test15(ubyte %A) {
Chris Lattner2e13cea2004-05-25 04:28:43 +000097 %c = cast ubyte %A to sbyte
98 %X = setlt sbyte %c, 0 ; setgt %A, 127
Chris Lattner3c4de7f2004-02-23 07:16:03 +000099 ret bool %X
100}
101
Chris Lattner2e13cea2004-05-25 04:28:43 +0000102bool %test16(int* %P) {
103 %c = cast int* %P to bool ;; setne P, null
104 ret bool %c
105}
Chris Lattner6c088922004-07-20 00:57:21 +0000106
Chris Lattner6c088922004-07-20 00:57:21 +0000107short %test17(bool %tmp3) {
108 %c = cast bool %tmp3 to int
109 %t86 = cast int %c to short
110 ret short %t86
111}
112
113short %test18(sbyte %tmp3) {
114 %c = cast sbyte %tmp3 to int
115 %t86 = cast int %c to short
116 ret short %t86
117}
118
Chris Lattnerb5ddea52004-09-29 03:18:20 +0000119bool %test19(int %X) {
Chris Lattner2a73a0b2005-01-31 05:17:31 +0000120 %c = cast int %X to long
121 %Z = setlt long %c, 12345
Chris Lattnerb5ddea52004-09-29 03:18:20 +0000122 ret bool %Z
123}
124
125bool %test20(bool %B) {
Chris Lattner2a73a0b2005-01-31 05:17:31 +0000126 %c = cast bool %B to int
127 %D = setlt int %c, -1
Chris Lattnerb5ddea52004-09-29 03:18:20 +0000128 ret bool %D ;; false
129}
Chris Lattner296fcba2005-01-01 16:13:43 +0000130
131uint %test21(uint %X) {
Chris Lattner2a73a0b2005-01-31 05:17:31 +0000132 %c1 = cast uint %X to sbyte
133 %c2 = cast sbyte %c1 to uint ;; sext -> zext -> and -> nop
134 %RV = and uint %c2, 255
Chris Lattner296fcba2005-01-01 16:13:43 +0000135 ret uint %RV
136}
137
138uint %test22(uint %X) {
Chris Lattner2a73a0b2005-01-31 05:17:31 +0000139 %c1 = cast uint %X to sbyte
140 %c2 = cast sbyte %c1 to uint ;; sext -> zext -> and -> nop
141 %RV = shl uint %c2, ubyte 24
Chris Lattner296fcba2005-01-01 16:13:43 +0000142 ret uint %RV
143}
144
145int %test23(int %X) {
Chris Lattner2a73a0b2005-01-31 05:17:31 +0000146 %c1 = cast int %X to ushort ;; Turn into an AND even though X
147 %c2 = cast ushort %c1 to int ;; and Z are signed.
148 ret int %c2
Chris Lattner296fcba2005-01-01 16:13:43 +0000149}
150
151bool %test24(bool %C) {
152 %X = select bool %C, uint 14, uint 1234
Chris Lattner2a73a0b2005-01-31 05:17:31 +0000153 %c = cast uint %X to bool ;; Fold cast into select
154 ret bool %c
Chris Lattner296fcba2005-01-01 16:13:43 +0000155}
156
Chris Lattner0f991192005-01-31 05:51:18 +0000157void %test25(int** %P) {
158 %c = cast int** %P to float**
159 store float* null, float** %c ;; Fold cast into null
160 ret void
161}
162
Chris Lattner6b8800d2006-01-19 07:39:20 +0000163int %test26(float %F) {
164 %c = cast float %F to double ;; no need to cast from float->double.
165 %D = cast double %c to int
166 ret int %D
167}
Chris Lattner23405aa2006-04-12 18:07:41 +0000168
169[4 x float]* %test27([9 x [4 x float]]* %A) {
170 %c = cast [9 x [4 x float]]* %A to [4 x float]*
171 ret [4 x float]* %c
172}
173
174float* %test28([4 x float]* %A) {
175 %c = cast [4 x float]* %A to float*
176 ret float* %c
177}
178
Chris Lattnera0771b82006-05-05 06:38:40 +0000179uint %test29(uint %c1, uint %c2) {
180 %tmp1 = cast uint %c1 to ubyte
181 %tmp4.mask = cast uint %c2 to ubyte
182 %tmp = or ubyte %tmp4.mask, %tmp1
183 %tmp10 = cast ubyte %tmp to uint
184 ret uint %tmp10
185}
186
Chris Lattner5250bae2006-05-13 02:00:07 +0000187uint %test30(uint %c1) {
188 %c2 = cast uint %c1 to ubyte
189 %c3 = xor ubyte %c2, 1
190 %c4 = cast ubyte %c3 to uint
191 ret uint %c4
192}
193
Chris Lattnere04deb92006-09-18 05:25:10 +0000194bool %test31(ulong %A) {
195 %B = cast ulong %A to int
196 %C = and int %B, 42
197 %D = seteq int %C, 10
198 ret bool %D
199}
Chris Lattner5250bae2006-05-13 02:00:07 +0000200
Chris Lattner537cf962006-10-01 19:39:45 +0000201
202void %test32(double** %tmp) {
203 %tmp8 = malloc [16 x sbyte]
204 %tmp8 = cast [16 x sbyte]* %tmp8 to double*
205 store double* %tmp8, double** %tmp
206 ret void
207}
208
Reid Spencer3da59db2006-11-27 01:05:10 +0000209uint %test33(uint %c1) {
210 %x = bitcast uint %c1 to float
211 %y = bitcast float %x to uint
212 ret uint %y
213}