Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 1 | ; This test makes sure that these instructions are properly eliminated. |
| 2 | ; |
Dan Gohman | 1880092 | 2009-09-11 18:01:28 +0000 | [diff] [blame] | 3 | ; RUN: opt < %s -instcombine -S | not grep icmp |
Tanya Lattner | aa6f5c9 | 2008-03-09 08:16:40 +0000 | [diff] [blame] | 4 | ; END. |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 5 | |
| 6 | @X = external global i32 ; <i32*> [#uses=2] |
Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 7 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 8 | define i1 @test1(i32 %A) { |
| 9 | %B = icmp eq i32 %A, %A ; <i1> [#uses=1] |
| 10 | ; Never true |
| 11 | %C = icmp eq i32* @X, null ; <i1> [#uses=1] |
| 12 | %D = and i1 %B, %C ; <i1> [#uses=1] |
| 13 | ret i1 %D |
Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 14 | } |
| 15 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 16 | define i1 @test2(i32 %A) { |
| 17 | %B = icmp ne i32 %A, %A ; <i1> [#uses=1] |
| 18 | ; Never false |
| 19 | %C = icmp ne i32* @X, null ; <i1> [#uses=1] |
| 20 | %D = or i1 %B, %C ; <i1> [#uses=1] |
| 21 | ret i1 %D |
Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 22 | } |
| 23 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 24 | define i1 @test3(i32 %A) { |
| 25 | %B = icmp slt i32 %A, %A ; <i1> [#uses=1] |
| 26 | ret i1 %B |
Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 27 | } |
| 28 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 29 | |
| 30 | define i1 @test4(i32 %A) { |
| 31 | %B = icmp sgt i32 %A, %A ; <i1> [#uses=1] |
| 32 | ret i1 %B |
Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 33 | } |
| 34 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 35 | define i1 @test5(i32 %A) { |
| 36 | %B = icmp sle i32 %A, %A ; <i1> [#uses=1] |
| 37 | ret i1 %B |
Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 38 | } |
| 39 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 40 | define i1 @test6(i32 %A) { |
| 41 | %B = icmp sge i32 %A, %A ; <i1> [#uses=1] |
| 42 | ret i1 %B |
Chris Lattner | 6022ad0 | 2002-05-06 05:51:26 +0000 | [diff] [blame] | 43 | } |
Chris Lattner | ff61e35 | 2002-08-03 20:24:58 +0000 | [diff] [blame] | 44 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 45 | define i1 @test7(i32 %A) { |
| 46 | ; true |
| 47 | %B = icmp uge i32 %A, 0 ; <i1> [#uses=1] |
| 48 | ret i1 %B |
Chris Lattner | ff61e35 | 2002-08-03 20:24:58 +0000 | [diff] [blame] | 49 | } |
| 50 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 51 | define i1 @test8(i32 %A) { |
| 52 | ; false |
| 53 | %B = icmp ult i32 %A, 0 ; <i1> [#uses=1] |
| 54 | ret i1 %B |
Chris Lattner | ff61e35 | 2002-08-03 20:24:58 +0000 | [diff] [blame] | 55 | } |
Chris Lattner | b86ab65 | 2002-08-09 23:34:18 +0000 | [diff] [blame] | 56 | |
| 57 | ;; test operations on boolean values these should all be eliminated$a |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 58 | define i1 @test9(i1 %A) { |
| 59 | ; false |
| 60 | %B = icmp ult i1 %A, false ; <i1> [#uses=1] |
| 61 | ret i1 %B |
Chris Lattner | b86ab65 | 2002-08-09 23:34:18 +0000 | [diff] [blame] | 62 | } |
| 63 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 64 | define i1 @test10(i1 %A) { |
| 65 | ; false |
| 66 | %B = icmp ugt i1 %A, true ; <i1> [#uses=1] |
| 67 | ret i1 %B |
Chris Lattner | a4f252d | 2003-07-23 17:01:18 +0000 | [diff] [blame] | 68 | } |
| 69 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 70 | define i1 @test11(i1 %A) { |
| 71 | ; true |
| 72 | %B = icmp ule i1 %A, true ; <i1> [#uses=1] |
| 73 | ret i1 %B |
Chris Lattner | a4f252d | 2003-07-23 17:01:18 +0000 | [diff] [blame] | 74 | } |
| 75 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 76 | define i1 @test12(i1 %A) { |
| 77 | ; true |
| 78 | %B = icmp uge i1 %A, false ; <i1> [#uses=1] |
| 79 | ret i1 %B |
| 80 | } |
| 81 | |
| 82 | define i1 @test13(i1 %A, i1 %B) { |
| 83 | ; A | ~B |
| 84 | %C = icmp uge i1 %A, %B ; <i1> [#uses=1] |
| 85 | ret i1 %C |
| 86 | } |
| 87 | |
| 88 | define i1 @test14(i1 %A, i1 %B) { |
| 89 | ; ~(A ^ B) |
| 90 | %C = icmp eq i1 %A, %B ; <i1> [#uses=1] |
| 91 | ret i1 %C |
| 92 | } |
| 93 | |
| 94 | define i1 @test16(i32 %A) { |
| 95 | %B = and i32 %A, 5 ; <i32> [#uses=1] |
| 96 | ; Is never true |
| 97 | %C = icmp eq i32 %B, 8 ; <i1> [#uses=1] |
| 98 | ret i1 %C |
| 99 | } |
| 100 | |
| 101 | define i1 @test17(i8 %A) { |
| 102 | %B = or i8 %A, 1 ; <i8> [#uses=1] |
| 103 | ; Always false |
| 104 | %C = icmp eq i8 %B, 2 ; <i1> [#uses=1] |
| 105 | ret i1 %C |
| 106 | } |
| 107 | |
| 108 | define i1 @test18(i1 %C, i32 %a) { |
Chris Lattner | 5e0ab5c | 2004-09-29 05:06:12 +0000 | [diff] [blame] | 109 | entry: |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 110 | br i1 %C, label %endif, label %else |
Chris Lattner | 5e0ab5c | 2004-09-29 05:06:12 +0000 | [diff] [blame] | 111 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 112 | else: ; preds = %entry |
Chris Lattner | 5e0ab5c | 2004-09-29 05:06:12 +0000 | [diff] [blame] | 113 | br label %endif |
| 114 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 115 | endif: ; preds = %else, %entry |
| 116 | %b.0 = phi i32 [ 0, %entry ], [ 1, %else ] ; <i32> [#uses=1] |
| 117 | %tmp.4 = icmp slt i32 %b.0, 123 ; <i1> [#uses=1] |
| 118 | ret i1 %tmp.4 |
Chris Lattner | 5e0ab5c | 2004-09-29 05:06:12 +0000 | [diff] [blame] | 119 | } |
| 120 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 121 | define i1 @test19(i1 %A, i1 %B) { |
| 122 | %a = zext i1 %A to i32 ; <i32> [#uses=1] |
| 123 | %b = zext i1 %B to i32 ; <i32> [#uses=1] |
| 124 | %C = icmp eq i32 %a, %b ; <i1> [#uses=1] |
| 125 | ret i1 %C |
Chris Lattner | 624d5cb | 2005-04-24 06:55:33 +0000 | [diff] [blame] | 126 | } |
Chris Lattner | 3538a4f | 2005-05-04 19:05:02 +0000 | [diff] [blame] | 127 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 128 | define i32 @test20(i32 %A) { |
| 129 | %B = and i32 %A, 1 ; <i32> [#uses=1] |
| 130 | %C = icmp ne i32 %B, 0 ; <i1> [#uses=1] |
| 131 | %D = zext i1 %C to i32 ; <i32> [#uses=1] |
| 132 | ret i32 %D |
Chris Lattner | 3538a4f | 2005-05-04 19:05:02 +0000 | [diff] [blame] | 133 | } |
Chris Lattner | 838dae0 | 2005-05-06 01:51:05 +0000 | [diff] [blame] | 134 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 135 | define i32 @test21(i32 %a) { |
| 136 | %tmp.6 = and i32 %a, 4 ; <i32> [#uses=1] |
| 137 | %not.tmp.7 = icmp ne i32 %tmp.6, 0 ; <i1> [#uses=1] |
| 138 | %retval = zext i1 %not.tmp.7 to i32 ; <i32> [#uses=1] |
| 139 | ret i32 %retval |
Chris Lattner | 838dae0 | 2005-05-06 01:51:05 +0000 | [diff] [blame] | 140 | } |
| 141 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 142 | define i1 @test22(i32 %A, i32 %X) { |
| 143 | %B = and i32 %A, 100663295 ; <i32> [#uses=1] |
| 144 | %C = icmp ult i32 %B, 268435456 ; <i1> [#uses=1] |
| 145 | %Y = and i32 %X, 7 ; <i32> [#uses=1] |
| 146 | %Z = icmp sgt i32 %Y, -1 ; <i1> [#uses=1] |
| 147 | %R = or i1 %C, %Z ; <i1> [#uses=1] |
| 148 | ret i1 %R |
Chris Lattner | 2234a13 | 2006-02-12 02:06:31 +0000 | [diff] [blame] | 149 | } |
Chris Lattner | a8bd74d5 | 2006-02-27 02:36:19 +0000 | [diff] [blame] | 150 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 151 | define i32 @test23(i32 %a) { |
| 152 | %tmp.1 = and i32 %a, 1 ; <i32> [#uses=1] |
| 153 | %tmp.2 = icmp eq i32 %tmp.1, 0 ; <i1> [#uses=1] |
| 154 | %tmp.3 = zext i1 %tmp.2 to i32 ; <i32> [#uses=1] |
| 155 | ret i32 %tmp.3 |
Chris Lattner | a8bd74d5 | 2006-02-27 02:36:19 +0000 | [diff] [blame] | 156 | } |
| 157 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 158 | define i32 @test24(i32 %a) { |
| 159 | %tmp1 = and i32 %a, 4 ; <i32> [#uses=1] |
| 160 | %tmp.1 = lshr i32 %tmp1, 2 ; <i32> [#uses=1] |
| 161 | %tmp.2 = icmp eq i32 %tmp.1, 0 ; <i1> [#uses=1] |
| 162 | %tmp.3 = zext i1 %tmp.2 to i32 ; <i32> [#uses=1] |
| 163 | ret i32 %tmp.3 |
Chris Lattner | a8bd74d5 | 2006-02-27 02:36:19 +0000 | [diff] [blame] | 164 | } |
| 165 | |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 166 | define i1 @test25(i32 %A) { |
| 167 | %B = and i32 %A, 2 ; <i32> [#uses=1] |
| 168 | %C = icmp ugt i32 %B, 2 ; <i1> [#uses=1] |
| 169 | ret i1 %C |
Chris Lattner | ec00204 | 2007-04-09 23:51:49 +0000 | [diff] [blame] | 170 | } |
Tanya Lattner | 5640bd1 | 2008-03-01 09:15:35 +0000 | [diff] [blame] | 171 | |