--- /dev/null
+; This file contains various testcases that require tracking whether bits are
+; set or cleared by various instructions.
+
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep %ELIM
+
+; test1 - Eliminating the casts in this testcase (by narrowing the AND
+; operation) allows instcombine to realize the function always returns false.
+;
+bool %test1(int %A, int %B) {
+ %C1 = setlt int %A, %B
+ %ELIM1 = cast bool %C1 to uint
+ %C2 = setgt int %A, %B
+ %ELIM2 = cast bool %C2 to uint
+ %C3 = and uint %ELIM1, %ELIM2
+ %ELIM3 = cast uint %C3 to bool
+ ret bool %ELIM3
+}
+
-; I'm not really sure if instcombine should do things like these. LevelRaise
-; already sufficiently takes care of these cases, but level raise is really
-; slow. Might it be better to make there be an instcombine prepass before
-; level raise that takes care of the obvious stuff?
+; This tests for various complex cast elimination cases instcombine should
+; handle.
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep cast
ret bool %c
}
-bool %test3(int %A, int %B) {
- %cond216 = setlt int %A, %B ; <bool> [#uses=1]
- %cst109 = cast bool %cond216 to uint ; <uint> [#uses=1]
- %cond219 = setgt int %A, %B ; <bool> [#uses=1]
- %cst111 = cast bool %cond219 to uint ; <uint> [#uses=1]
- %reg113 = and uint %cst109, %cst111 ; <uint> [#uses=1]
- %cst222 = cast uint %reg113 to bool ; <int> [#uses=1]
- ret bool %cst222
-}
-
int %test4(int %A) {
%B = cast int %A to uint
%C = shl uint %B, ubyte 2