Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 1 | ; This test makes sure that mul instructions are properly eliminated. |
| 2 | ; |
Reid Spencer | d0e30dc | 2006-12-02 04:23:10 +0000 | [diff] [blame] | 3 | ; RUN: llvm-upgrade < %s | llvm-as | opt -instcombine | llvm-dis | not grep mul |
Reid Spencer | ede8c3b | 2007-04-15 07:38:21 +0000 | [diff] [blame] | 4 | ; END. |
Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 5 | |
| 6 | implementation |
| 7 | |
Chris Lattner | 2fa7577 | 2003-03-10 19:44:01 +0000 | [diff] [blame] | 8 | int %test1(int %A) { |
Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 9 | %B = mul int %A, 1 |
| 10 | ret int %B |
Chris Lattner | 2fa7577 | 2003-03-10 19:44:01 +0000 | [diff] [blame] | 11 | } |
Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 12 | |
Chris Lattner | 2fa7577 | 2003-03-10 19:44:01 +0000 | [diff] [blame] | 13 | int %test2(int %A) { |
Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 14 | %B = mul int %A, 2 ; Should convert to an add instruction |
| 15 | ret int %B |
Chris Lattner | 2fa7577 | 2003-03-10 19:44:01 +0000 | [diff] [blame] | 16 | } |
Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 17 | |
Chris Lattner | 2fa7577 | 2003-03-10 19:44:01 +0000 | [diff] [blame] | 18 | int %test3(int %A) { |
Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 19 | %B = mul int %A, 0 ; This should disappear entirely |
| 20 | ret int %B |
Chris Lattner | 2fa7577 | 2003-03-10 19:44:01 +0000 | [diff] [blame] | 21 | } |
Chris Lattner | 5c9040e | 2002-04-29 22:24:24 +0000 | [diff] [blame] | 22 | |
Chris Lattner | c5fccf3 | 2003-02-18 19:28:47 +0000 | [diff] [blame] | 23 | double %test4(double %A) { |
| 24 | %B = mul double 1.0, %A ; This is safe for FP |
| 25 | ret double %B |
| 26 | } |
| 27 | |
| 28 | int %test5(int %A) { |
| 29 | %B = mul int %A, 8 |
| 30 | ret int %B |
| 31 | } |
Chris Lattner | f67d52d | 2003-03-10 22:43:56 +0000 | [diff] [blame] | 32 | |
Chris Lattner | 63912f0 | 2003-06-25 17:10:34 +0000 | [diff] [blame] | 33 | ubyte %test6(ubyte %A) { |
Chris Lattner | f67d52d | 2003-03-10 22:43:56 +0000 | [diff] [blame] | 34 | %B = mul ubyte %A, 8 |
Chris Lattner | 4be846d | 2003-06-28 22:31:37 +0000 | [diff] [blame] | 35 | %C = mul ubyte %B, 8 |
Chris Lattner | f67d52d | 2003-03-10 22:43:56 +0000 | [diff] [blame] | 36 | ret ubyte %C |
| 37 | } |
Chris Lattner | 63912f0 | 2003-06-25 17:10:34 +0000 | [diff] [blame] | 38 | |
| 39 | int %test7(int %i) { |
| 40 | %tmp = mul int %i, -1 ; %tmp = sub 0, %i |
| 41 | ret int %tmp |
| 42 | } |
| 43 | |
| 44 | ulong %test8(ulong %i) { |
| 45 | %j = mul ulong %i, 18446744073709551615 ; tmp = sub 0, %i |
| 46 | ret ulong %j |
| 47 | } |
Chris Lattner | 80e8c46 | 2003-09-11 22:23:48 +0000 | [diff] [blame] | 48 | |
| 49 | uint %test9(uint %i) { |
| 50 | %j = mul uint %i, 4294967295 ; %j = sub 0, %i |
| 51 | ret uint %j |
| 52 | } |
Chris Lattner | d0ffbe1 | 2004-02-23 05:38:47 +0000 | [diff] [blame] | 53 | |
| 54 | uint %test10(int %a, uint %b) { |
| 55 | %c = setlt int %a, 0 |
| 56 | %d = cast bool %c to uint |
| 57 | %e = mul uint %d, %b ; e = b & (a >> 31) |
| 58 | ret uint %e |
| 59 | } |
| 60 | |
Chris Lattner | fb302df | 2004-02-23 05:59:52 +0000 | [diff] [blame] | 61 | uint %test11(int %a, uint %b) { |
| 62 | %c = setle int %a, -1 |
| 63 | %d = cast bool %c to uint |
| 64 | %e = mul uint %d, %b ; e = b & (a >> 31) |
| 65 | ret uint %e |
| 66 | } |
| 67 | |
Chris Lattner | d8bdf53 | 2007-07-16 04:09:00 +0000 | [diff] [blame] | 68 | uint %test12(ubyte %a, uint %b) { |
Chris Lattner | 6ddaa24 | 2004-02-23 06:37:33 +0000 | [diff] [blame] | 69 | %c = setgt ubyte %a, 127 |
| 70 | %d = cast bool %c to uint |
| 71 | %e = mul uint %d, %b ; e = b & (a >> 31) |
| 72 | ret uint %e |
| 73 | } |
| 74 | |