| Chris Lattner | 74e9547 | 2002-05-06 05:43:36 +0000 | [diff] [blame] | 1 | ; This test makes sure that these 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 sh |
| Reid Spencer | 91948d4 | 2007-04-14 20:13:02 +0000 | [diff] [blame] | 4 | ; END. |
| Chris Lattner | 74e9547 | 2002-05-06 05:43:36 +0000 | [diff] [blame] | 5 | |
| 6 | implementation |
| 7 | |
| Chris Lattner | 87301bc | 2003-03-10 18:20:53 +0000 | [diff] [blame] | 8 | int %test1(int %A) { |
| Chris Lattner | 74e9547 | 2002-05-06 05:43:36 +0000 | [diff] [blame] | 9 | %B = shl int %A, ubyte 0 |
| 10 | ret int %B |
| 11 | } |
| 12 | |
| Chris Lattner | 87301bc | 2003-03-10 18:20:53 +0000 | [diff] [blame] | 13 | int %test2(ubyte %A) { |
| Chris Lattner | 74e9547 | 2002-05-06 05:43:36 +0000 | [diff] [blame] | 14 | %B = shl int 0, ubyte %A |
| 15 | ret int %B |
| 16 | } |
| 17 | |
| Chris Lattner | 87301bc | 2003-03-10 18:20:53 +0000 | [diff] [blame] | 18 | int %test3(int %A) { |
| Chris Lattner | 74e9547 | 2002-05-06 05:43:36 +0000 | [diff] [blame] | 19 | %B = shr int %A, ubyte 0 |
| 20 | ret int %B |
| 21 | } |
| 22 | |
| Chris Lattner | 87301bc | 2003-03-10 18:20:53 +0000 | [diff] [blame] | 23 | int %test4(ubyte %A) { |
| Chris Lattner | 74e9547 | 2002-05-06 05:43:36 +0000 | [diff] [blame] | 24 | %B = shr int 0, ubyte %A |
| 25 | ret int %B |
| 26 | } |
| 27 | |
| Chris Lattner | 87301bc | 2003-03-10 18:20:53 +0000 | [diff] [blame] | 28 | uint %test5(uint %A) { |
| Chris Lattner | bcb8138 | 2002-05-06 16:11:31 +0000 | [diff] [blame] | 29 | %B = shr uint %A, ubyte 32 ;; shift all bits out |
| 30 | ret uint %B |
| Chris Lattner | 74e9547 | 2002-05-06 05:43:36 +0000 | [diff] [blame] | 31 | } |
| 32 | |
| Chris Lattner | d97f054 | 2003-03-10 19:16:20 +0000 | [diff] [blame] | 33 | uint %test5a(uint %A) { |
| 34 | %B = shl uint %A, ubyte 32 ;; shift all bits out |
| 35 | ret uint %B |
| 36 | } |
| 37 | |
| Chris Lattner | 025e58d | 2002-09-10 23:03:10 +0000 | [diff] [blame] | 38 | uint %test6(uint %A) { |
| Chris Lattner | bcbac5e | 2003-08-13 04:20:06 +0000 | [diff] [blame] | 39 | %B = shl uint %A, ubyte 1 ;; convert to an mul instruction |
| 40 | %C = mul uint %B, 3 |
| 41 | ret uint %C |
| Chris Lattner | 025e58d | 2002-09-10 23:03:10 +0000 | [diff] [blame] | 42 | } |
| Chris Lattner | ee5c8a9 | 2002-10-08 16:10:35 +0000 | [diff] [blame] | 43 | |
| 44 | int %test7(ubyte %A) { |
| 45 | %B = shr int -1, ubyte %A ;; Always equal to -1 |
| 46 | ret int %B |
| 47 | } |
| Chris Lattner | d97f054 | 2003-03-10 19:16:20 +0000 | [diff] [blame] | 48 | |
| 49 | ubyte %test8(ubyte %A) { ;; (A << 5) << 3 === A << 8 == 0 |
| 50 | %B = shl ubyte %A, ubyte 5 |
| 51 | %C = shl ubyte %B, ubyte 3 |
| 52 | ret ubyte %C |
| 53 | } |
| 54 | |
| 55 | ubyte %test9(ubyte %A) { ;; (A << 7) >> 7 === A & 1 |
| 56 | %B = shl ubyte %A, ubyte 7 |
| 57 | %C = shr ubyte %B, ubyte 7 |
| 58 | ret ubyte %C |
| 59 | } |
| 60 | |
| 61 | ubyte %test10(ubyte %A) { ;; (A >> 7) << 7 === A & 128 |
| 62 | %B = shr ubyte %A, ubyte 7 |
| 63 | %C = shl ubyte %B, ubyte 7 |
| 64 | ret ubyte %C |
| 65 | } |
| 66 | |
| Chris Lattner | 9e2dc89 | 2003-07-24 18:38:09 +0000 | [diff] [blame] | 67 | ubyte %test11(ubyte %A) { ;; (A >> 3) << 4 === (A & 0x1F) << 1 |
| Chris Lattner | bcbac5e | 2003-08-13 04:20:06 +0000 | [diff] [blame] | 68 | %a = mul ubyte %A, 3 |
| 69 | %B = shr ubyte %a, ubyte 3 |
| Chris Lattner | d97f054 | 2003-03-10 19:16:20 +0000 | [diff] [blame] | 70 | %C = shl ubyte %B, ubyte 4 |
| 71 | ret ubyte %C |
| 72 | } |
| 73 | |
| Chris Lattner | 9e2dc89 | 2003-07-24 18:38:09 +0000 | [diff] [blame] | 74 | int %test12(int %A) { |
| 75 | %B = shr int %A, ubyte 8 ;; (A >> 8) << 8 === A & -256 |
| 76 | %C = shl int %B, ubyte 8 |
| 77 | ret int %C |
| 78 | } |
| 79 | |
| 80 | sbyte %test13(sbyte %A) { ;; (A >> 3) << 4 === (A & -8) * 2 |
| Chris Lattner | bcbac5e | 2003-08-13 04:20:06 +0000 | [diff] [blame] | 81 | %a = mul sbyte %A, 3 |
| 82 | %B = shr sbyte %a, ubyte 3 |
| Chris Lattner | 9e2dc89 | 2003-07-24 18:38:09 +0000 | [diff] [blame] | 83 | %C = shl sbyte %B, ubyte 4 |
| 84 | ret sbyte %C |
| 85 | } |
| Chris Lattner | 699b952 | 2003-08-12 21:20:49 +0000 | [diff] [blame] | 86 | |
| 87 | uint %test14(uint %A) { |
| 88 | %B = shr uint %A, ubyte 4 |
| 89 | %C = or uint %B, 1234 |
| 90 | %D = shl uint %C, ubyte 4 ;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4) |
| 91 | ret uint %D |
| 92 | } |
| Chris Lattner | e8c98de | 2003-08-12 21:22:51 +0000 | [diff] [blame] | 93 | uint %test14a(uint %A) { |
| 94 | %B = shl uint %A, ubyte 4 |
| 95 | %C = and uint %B, 1234 |
| 96 | %D = shr uint %C, ubyte 4 ;; D = ((B | 1234) << 4) === ((B << 4)|(1234 << 4) |
| 97 | ret uint %D |
| Chris Lattner | 699b952 | 2003-08-12 21:20:49 +0000 | [diff] [blame] | 98 | } |
| Chris Lattner | 24cd6b9 | 2004-04-09 23:47:24 +0000 | [diff] [blame] | 99 | |
| 100 | int %test15(bool %C) { |
| 101 | %A = select bool %C, int 3, int 1 |
| 102 | %V = shl int %A, ubyte 2 |
| 103 | ret int %V |
| 104 | } |
| 105 | |
| 106 | int %test15a(bool %C) { |
| 107 | %A = select bool %C, ubyte 3, ubyte 1 |
| 108 | %V = shl int 64, ubyte %A |
| 109 | ret int %V |
| 110 | } |
| 111 | |
| Chris Lattner | 6a02158 | 2004-05-25 06:30:49 +0000 | [diff] [blame] | 112 | bool %test16(int %X) { |
| 113 | %tmp.3 = shr int %X, ubyte 4 |
| 114 | %tmp.6 = and int %tmp.3, 1 |
| 115 | %tmp.7 = setne int %tmp.6, 0 ;; X & 16 != 0 |
| 116 | ret bool %tmp.7 |
| 117 | } |
| Chris Lattner | fbfb4d4 | 2004-09-27 16:21:26 +0000 | [diff] [blame] | 118 | |
| 119 | bool %test17(uint %A) { |
| 120 | %B = shr uint %A, ubyte 3 |
| 121 | %C = seteq uint %B, 1234 |
| 122 | ret bool %C |
| 123 | } |
| 124 | |
| 125 | bool %test18(ubyte %A) { |
| 126 | %B = shr ubyte %A, ubyte 7 |
| 127 | %C = seteq ubyte %B, 123 ;; false |
| 128 | ret bool %C |
| 129 | } |
| 130 | |
| 131 | bool %test19(int %A) { |
| 132 | %B = shr int %A, ubyte 2 |
| 133 | %C = seteq int %B, 0 ;; (X & -4) == 0 |
| 134 | ret bool %C |
| 135 | } |
| 136 | |
| 137 | bool %test19a(int %A) { |
| 138 | %B = shr int %A, ubyte 2 |
| 139 | %C = seteq int %B, -1 ;; (X & -4) == -4 |
| 140 | ret bool %C |
| 141 | } |
| 142 | |
| 143 | bool %test20(sbyte %A) { |
| 144 | %B = shr sbyte %A, ubyte 7 |
| 145 | %C = seteq sbyte %B, 123 ;; false |
| 146 | ret bool %C |
| 147 | } |
| Chris Lattner | 3dd0ae6 | 2004-09-28 18:18:35 +0000 | [diff] [blame] | 148 | |
| 149 | bool %test21(ubyte %A) { |
| 150 | %B = shl ubyte %A, ubyte 4 |
| 151 | %C = seteq ubyte %B, 128 |
| 152 | ret bool %C |
| 153 | } |
| 154 | |
| 155 | bool %test22(ubyte %A) { |
| 156 | %B = shl ubyte %A, ubyte 4 |
| 157 | %C = seteq ubyte %B, 0 |
| 158 | ret bool %C |
| 159 | } |
| 160 | |
| Chris Lattner | 1524489f | 2005-05-06 04:11:32 +0000 | [diff] [blame] | 161 | sbyte %test23(int %A) { |
| 162 | %B = shl int %A, ubyte 24 ;; casts not needed |
| 163 | %C = shr int %B, ubyte 24 |
| 164 | %D = cast int %C to sbyte |
| 165 | ret sbyte %D |
| 166 | } |
| Chris Lattner | 5140c15 | 2005-05-08 17:31:24 +0000 | [diff] [blame] | 167 | |
| 168 | sbyte %test24(sbyte %X) { |
| 169 | %Y = and sbyte %X, -5 ; ~4 |
| 170 | %Z = shl sbyte %Y, ubyte 5 |
| 171 | %Q = shr sbyte %Z, ubyte 5 |
| 172 | ret sbyte %Q |
| 173 | } |
| 174 | |
| Chris Lattner | 1813aab | 2005-09-18 05:10:39 +0000 | [diff] [blame] | 175 | uint %test25(uint %tmp.2, uint %AA) { |
| 176 | %x = shr uint %AA, ubyte 17 |
| 177 | %tmp.3 = shr uint %tmp.2, ubyte 17 ; <uint> [#uses=1] |
| 178 | %tmp.5 = add uint %tmp.3, %x ; <uint> [#uses=1] |
| 179 | %tmp.6 = shl uint %tmp.5, ubyte 17 ; <uint> [#uses=1] |
| 180 | ret uint %tmp.6 |
| 181 | } |
| 182 | |
| Chris Lattner | 60d3002 | 2006-01-06 07:48:28 +0000 | [diff] [blame] | 183 | int %test26(uint %A) { ;; handle casts between shifts. |
| 184 | %B = shr uint %A, ubyte 1 |
| 185 | %C = cast uint %B to int |
| 186 | %D = shl int %C, ubyte 1 |
| 187 | ret int %D |
| 188 | } |
| 189 | |