| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- ; This test case tests the InstructionCombining optimization that
- ; reduces things like:
- ; %Y = sext i8 %X to i32
- ; %C = icmp ult i32 %Y, 1024
- ; to
- ; %C = i1 true
- ; It includes test cases for different constant values, signedness of the
- ; cast operands, and types of setCC operators. In all cases, the cast should
- ; be eliminated. In many cases the setCC is also eliminated based on the
- ; constant value and the range of the casted value.
- ;
- ; 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
- }
|