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