Canonicalize addrspacecast ConstExpr between different pointer types
[oota-llvm.git] / test / Transforms / InstCombine / 2004-11-27-SetCCForCastLargerAndConstant.ll
index 836d1eb27aadc1cd4dfe154e48ae1aeb91efe29b..6672b6c6d4e5fea950e98327148dfd5aa51c3724 100644 (file)
 ; be eliminated. In many cases the setCC is also eliminated based on the
 ; constant value and the range of the casted value.
 ;
-; RUN: llvm-as < %s -o - | opt -instcombine | llvm-dis | \
-; RUN:    notcast .*int
-
+; RUN: opt < %s -instcombine -S | FileCheck %s
+; END.
 define i1 @lt_signed_to_large_unsigned(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp ult i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C1 = icmp sgt i8 %SB, -1
+; CHECK: ret i1 %C1
 }
 
 define i1 @lt_signed_to_large_signed(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp slt i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 true
 }
 
 define i1 @lt_signed_to_large_negative(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp slt i32 %Y, -1024             ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 false
+}
+
+define i1 @lt_signed_to_small_unsigned(i8 %SB) {
+        %Y = sext i8 %SB to i32
+        %C = icmp ult i32 %Y, 17
+        ret i1 %C
+; CHECK: %C = icmp ult i8 %SB, 17
+; CHECK: ret i1 %C
 }
 
 define i1 @lt_signed_to_small_signed(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp slt i32 %Y, 17                ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C = icmp slt i8 %SB, 17
+; CHECK: ret i1 %C
 }
 define i1 @lt_signed_to_small_negative(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp slt i32 %Y, -17               ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C = icmp slt i8 %SB, -17
+; CHECK: ret i1 %C
 }
 
 define i1 @lt_unsigned_to_large_unsigned(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp ult i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 true
 }
 
 define i1 @lt_unsigned_to_large_signed(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp slt i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 true
 }
 
 define i1 @lt_unsigned_to_large_negative(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp slt i32 %Y, -1024             ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 false
 }
 
 define i1 @lt_unsigned_to_small_unsigned(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp ult i32 %Y, 17                ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C = icmp ult i8 %SB, 17
+; CHECK: ret i1 %C
+}
+
+define i1 @lt_unsigned_to_small_signed(i8 %SB) {
+        %Y = zext i8 %SB to i32
+        %C = icmp slt i32 %Y, 17
+        ret i1 %C
+; CHECK: %C = icmp ult i8 %SB, 17
+; CHECK: ret i1 %C
 }
 
 define i1 @lt_unsigned_to_small_negative(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp slt i32 %Y, -17               ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 false
 }
 
 define i1 @gt_signed_to_large_unsigned(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp ugt i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C = icmp slt i8 %SB, 0
+; CHECK: ret i1 %C
 }
 
 define i1 @gt_signed_to_large_signed(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp sgt i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 false
 }
 
 define i1 @gt_signed_to_large_negative(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp sgt i32 %Y, -1024             ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 true
 }
+
+define i1 @gt_signed_to_small_unsigned(i8 %SB) {
+        %Y = sext i8 %SB to i32
+        %C = icmp ugt i32 %Y, 17
+        ret i1 %C
+; CHECK: %C = icmp ugt i8 %SB, 17
+; CHECK: ret i1 %C
+}
+
 define i1 @gt_signed_to_small_signed(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp sgt i32 %Y, 17                ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C = icmp sgt i8 %SB, 17
+; CHECK: ret i1 %C
 }
 
 define i1 @gt_signed_to_small_negative(i8 %SB) {
         %Y = sext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp sgt i32 %Y, -17               ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C = icmp sgt i8 %SB, -17
+; CHECK: ret i1 %C
 }
 
 define i1 @gt_unsigned_to_large_unsigned(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp ugt i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 false
 }
 
 define i1 @gt_unsigned_to_large_signed(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp sgt i32 %Y, 1024              ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 false
 }
 
 define i1 @gt_unsigned_to_large_negative(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp sgt i32 %Y, -1024             ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 true
 }
 
 define i1 @gt_unsigned_to_small_unsigned(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp ugt i32 %Y, 17                ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: %C = icmp ugt i8 %SB, 17
+; CHECK: ret i1 %C
+}
+
+define i1 @gt_unsigned_to_small_signed(i8 %SB) {
+        %Y = zext i8 %SB to i32
+        %C = icmp sgt i32 %Y, 17
+        ret i1 %C
+; CHECK: %C = icmp ugt i8 %SB, 17
+; CHECK: ret i1 %C
 }
 
 define i1 @gt_unsigned_to_small_negative(i8 %SB) {
         %Y = zext i8 %SB to i32         ; <i32> [#uses=1]
         %C = icmp sgt i32 %Y, -17               ; <i1> [#uses=1]
         ret i1 %C
+; CHECK: ret i1 true
 }