From 41a032d8e82fced033924245bd2ec9c7de00ff64 Mon Sep 17 00:00:00 2001 From: Veera Date: Sun, 15 Dec 2024 06:19:31 +0000 Subject: [PATCH 1/2] Add Test --- .../select-with-extreme-eq-cond.ll | 501 ++++++++++++++++++ 1 file changed, 501 insertions(+) create mode 100644 llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll diff --git a/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll b/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll new file mode 100644 index 0000000000000..f2d344d03aedf --- /dev/null +++ b/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll @@ -0,0 +1,501 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt < %s -passes=instcombine -S | FileCheck %s + +define i1 @compare_unsigned_min(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_unsigned_min( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP2]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_signed_min(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_signed_min( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -128 +; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, -128 + %cmp2 = icmp ne i8 %y, -128 + %cmp3 = icmp slt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_unsigned_max(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_unsigned_max( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -1 +; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 255 + %cmp2 = icmp ne i8 %y, 255 + %cmp3 = icmp ugt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_signed_max(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_signed_max( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 127 +; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 127 + %cmp2 = icmp ne i8 %y, 127 + %cmp3 = icmp sgt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @relational_cmp_unsigned_min(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @relational_cmp_unsigned_min( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp ule i8 %x, 0 + %cmp2 = icmp ugt i8 %y, 0 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @relational_cmp_signed_min(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @relational_cmp_signed_min( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -128 +; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp sle i8 %x, -128 + %cmp2 = icmp sgt i8 %y, -128 + %cmp3 = icmp slt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @relational_cmp_unsigned_max(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @relational_cmp_unsigned_max( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -1 +; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp uge i8 %x, 255 + %cmp2 = icmp ult i8 %y, 255 + %cmp3 = icmp ugt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @relational_cmp_signed_max(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @relational_cmp_signed_max( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 127 +; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp sge i8 %x, 127 + %cmp2 = icmp slt i8 %y, 127 + %cmp3 = icmp sgt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +declare void @use(i1) + +define i1 @compare_signed_max_multiuse(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_signed_max_multiuse( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 127 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 127 +; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] +; CHECK-NEXT: call void @use(i1 [[TMP4]]) +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 127 + %cmp2 = icmp ne i8 %y, 127 + %cmp3 = icmp sgt i8 %x, %y + call void @use(i1 %cmp3) + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_signed_min_samesign(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_signed_min_samesign( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -128 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -128 +; CHECK-NEXT: [[CMP3:%.*]] = icmp samesign slt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, -128 + %cmp2 = icmp ne i8 %y, -128 + %cmp3 = icmp samesign slt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_flipped(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_flipped( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ugt i8 [[Y]], [[X]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ugt i8 %y, %x + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_swapped(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_swapped( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT1:%.*]] = select i1 [[CMP1_NOT]], i1 [[CMP2]], i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[RESULT1]] +; +start: + %cmp1 = icmp ne i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2 + ret i1 %result +} + +define i1 @compare_swapped_flipped_unsigned_max(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_swapped_flipped_unsigned_max( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -1 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[Y]], [[X]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1_NOT]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp ne i8 %x, 255 + %cmp2 = icmp ne i8 %y, 255 + %cmp3 = icmp ult i8 %y, %x + %result = select i1 %cmp1, i1 %cmp3, i1 %cmp2 + ret i1 %result +} + +define i1 @compare_unsigned_min_illegal_type(i9 %x, i9 %y) { +; CHECK-LABEL: define i1 @compare_unsigned_min_illegal_type( +; CHECK-SAME: i9 [[X:%.*]], i9 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i9 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i9 [[Y]], 0 +; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i9 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP2]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i9 %x, 0 + %cmp2 = icmp ne i9 %y, 0 + %cmp3 = icmp ult i9 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_true_poison(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_true_poison( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: ret i1 [[CMP3]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 poison, i1 %cmp3 + ret i1 %result +} + +define <2 x i1> @compare_vector(<2 x i8> %x, <2 x i8> %y) { +; CHECK-LABEL: define <2 x i1> @compare_vector( +; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq <2 x i8> [[X]], zeroinitializer +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne <2 x i8> [[Y]], zeroinitializer +; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <2 x i8> [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select <2 x i1> [[CMP1]], <2 x i1> [[CMP2]], <2 x i1> [[TMP1]] +; CHECK-NEXT: ret <2 x i1> [[RESULT]] +; + %cmp1 = icmp eq <2 x i8> %x, zeroinitializer + %cmp2 = icmp ne <2 x i8> %y, zeroinitializer + %cmp3 = icmp ult <2 x i8> %x, %y + %result = select <2 x i1> %cmp1, <2 x i1> %cmp2, <2 x i1> %cmp3 + ret <2 x i1> %result +} + +define i1 @compare_pointer_negative(ptr %x, ptr %y) { +; CHECK-LABEL: define i1 @compare_pointer_negative( +; CHECK-SAME: ptr [[X:%.*]], ptr [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[X]], inttoptr (i8 127 to ptr) +; CHECK-NEXT: [[TMP3:%.*]] = icmp ne ptr [[Y]], inttoptr (i8 127 to ptr) +; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt ptr [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %X = inttoptr i8 127 to ptr + %cmp1 = icmp eq ptr %x, %X + %cmp2 = icmp ne ptr %y, %X + %cmp3 = icmp sgt ptr %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_float_negative(half %x, half %y) { +; CHECK-LABEL: define i1 @compare_float_negative( +; CHECK-SAME: half [[X:%.*]], half [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[TMP2:%.*]] = fcmp oeq half [[X]], 0xH0000 +; CHECK-NEXT: [[TMP3:%.*]] = fcmp one half [[Y]], 0xH0000 +; CHECK-NEXT: [[TMP4:%.*]] = fcmp ult half [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = fcmp oeq half %x, 0.0 + %cmp2 = fcmp one half %y, 0.0 + %cmp3 = fcmp ult half %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_unsigned_max_swapped_lhs_rhs_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_unsigned_max_swapped_lhs_rhs_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[DOTNOT:%.*]] = icmp ne i8 [[Y]], -1 +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[DOTNOT]], i1 [[TMP2]], i1 false +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 255 + %cmp2 = icmp ne i8 %y, 255 + %cmp3 = icmp ugt i8 %x, %y + %result = select i1 %cmp2, i1 %cmp1, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_signed_min_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_signed_min_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -127 +; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], -127 +; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, -127 + %cmp2 = icmp ne i8 %y, -127 + %cmp3 = icmp slt i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_unsigned_max_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_unsigned_max_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], -1 +; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], -1 +; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 255 + %cmp2 = icmp ne i8 %y, 255 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @non_strict_op_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @non_strict_op_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[TMP4:%.*]] = icmp ule i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[TMP2]], i1 [[TMP3]], i1 [[TMP4]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ule i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_poison_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_poison_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: ret i1 [[CMP2]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %result = select i1 %cmp1, i1 %cmp2, i1 poison + ret i1 %result +} + +define i1 @mismatched_cond_lhs_negative(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: define i1 @mismatched_cond_lhs_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[Z]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ult i8 %z, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @mismatched_trueval_lhs_negative(i8 %x, i8 %y, i8 %z) { +; CHECK-LABEL: define i1 @mismatched_trueval_lhs_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Z]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ult i8 %x, %z + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @mismatched_constant_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @mismatched_constant_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 2 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp ne i8 %y, 2 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @mismatched_constant_two_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @mismatched_constant_two_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 2 +; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 2 + %cmp2 = icmp ne i8 %y, 0 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} + +define i1 @compare_eq_eq_negative(i8 %x, i8 %y) { +; CHECK-LABEL: define i1 @compare_eq_eq_negative( +; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { +; CHECK-NEXT: [[START:.*:]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 +; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[Y]], 0 +; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[X]], [[Y]] +; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: ret i1 [[RESULT]] +; +start: + %cmp1 = icmp eq i8 %x, 0 + %cmp2 = icmp eq i8 %y, 0 + %cmp3 = icmp ult i8 %x, %y + %result = select i1 %cmp1, i1 %cmp2, i1 %cmp3 + ret i1 %result +} From 2280f2ff953f04c986a0b51233fee90186b4aaa7 Mon Sep 17 00:00:00 2001 From: Veera Date: Thu, 19 Dec 2024 05:38:42 +0000 Subject: [PATCH 2/2] Fold `A == MIN_INT ? B != MIN_INT : A < B` to `A < B` --- llvm/lib/Analysis/InstructionSimplify.cpp | 1 - .../InstCombine/InstCombineSelect.cpp | 44 +++++++++++ .../select-with-extreme-eq-cond.ll | 74 ++++--------------- 3 files changed, 59 insertions(+), 60 deletions(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 3325cd972cf1e..0b8ce7fa4cd81 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -7141,7 +7141,6 @@ static Value *simplifyInstructionWithOperands(Instruction *I, NewOps[1], I->getFastMathFlags(), Q, MaxRecurse); case Instruction::Select: return simplifySelectInst(NewOps[0], NewOps[1], NewOps[2], Q, MaxRecurse); - break; case Instruction::GetElementPtr: { auto *GEPI = cast(I); return simplifyGEPInst(GEPI->getSourceElementType(), NewOps[0], diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp index 50dfb58cadb17..02260eb151ad5 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -1781,6 +1781,46 @@ static Value *foldSelectInstWithICmpConst(SelectInst &SI, ICmpInst *ICI, return nullptr; } +/// `A == MIN_INT ? B != MIN_INT : A < B` --> `A < B` +/// `A == MAX_INT ? B != MAX_INT : A > B` --> `A > B` +static Instruction *foldSelectWithExtremeEqCond(Value *CmpLHS, Value *CmpRHS, + Value *TrueVal, + Value *FalseVal) { + Type *Ty = CmpLHS->getType(); + + if (Ty->isPtrOrPtrVectorTy()) + return nullptr; + + CmpPredicate Pred; + Value *B; + + if (!match(FalseVal, m_c_ICmp(Pred, m_Specific(CmpLHS), m_Value(B)))) + return nullptr; + + Value *TValRHS; + if (!match(TrueVal, m_SpecificICmp(ICmpInst::ICMP_NE, m_Specific(B), + m_Value(TValRHS)))) + return nullptr; + + APInt C; + unsigned BitWidth = Ty->getScalarSizeInBits(); + + if (ICmpInst::isLT(Pred)) { + C = CmpInst::isSigned(Pred) ? APInt::getSignedMinValue(BitWidth) + : APInt::getMinValue(BitWidth); + } else if (ICmpInst::isGT(Pred)) { + C = CmpInst::isSigned(Pred) ? APInt::getSignedMaxValue(BitWidth) + : APInt::getMaxValue(BitWidth); + } else { + return nullptr; + } + + if (!match(CmpRHS, m_SpecificInt(C)) || !match(TValRHS, m_SpecificInt(C))) + return nullptr; + + return new ICmpInst(Pred, CmpLHS, B); +} + static Instruction *foldSelectICmpEq(SelectInst &SI, ICmpInst *ICI, InstCombinerImpl &IC) { ICmpInst::Predicate Pred = ICI->getPredicate(); @@ -1795,6 +1835,10 @@ static Instruction *foldSelectICmpEq(SelectInst &SI, ICmpInst *ICI, if (Pred == ICmpInst::ICMP_NE) std::swap(TrueVal, FalseVal); + if (Instruction *Res = + foldSelectWithExtremeEqCond(CmpLHS, CmpRHS, TrueVal, FalseVal)) + return Res; + // Transform (X == C) ? X : Y -> (X == C) ? C : Y // specific handling for Bitwise operation. // x&y -> (x|y) ^ (x^y) or (x|y) & ~(x^y) diff --git a/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll b/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll index f2d344d03aedf..7f2cca44eab3b 100644 --- a/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll +++ b/llvm/test/Transforms/InstCombine/select-with-extreme-eq-cond.ll @@ -5,11 +5,8 @@ define i1 @compare_unsigned_min(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_unsigned_min( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 ; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP2]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP2]] ; start: %cmp1 = icmp eq i8 %x, 0 @@ -23,11 +20,8 @@ define i1 @compare_signed_min(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_signed_min( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -128 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -128 ; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP4]] ; start: %cmp1 = icmp eq i8 %x, -128 @@ -41,11 +35,8 @@ define i1 @compare_unsigned_max(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_unsigned_max( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -1 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -1 ; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP4]] ; start: %cmp1 = icmp eq i8 %x, 255 @@ -59,11 +50,8 @@ define i1 @compare_signed_max(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_signed_max( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 127 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 127 ; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP4]] ; start: %cmp1 = icmp eq i8 %x, 127 @@ -77,11 +65,8 @@ define i1 @relational_cmp_unsigned_min(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @relational_cmp_unsigned_min( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 ; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP4]] ; start: %cmp1 = icmp ule i8 %x, 0 @@ -95,11 +80,8 @@ define i1 @relational_cmp_signed_min(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @relational_cmp_signed_min( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -128 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -128 ; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP4]] ; start: %cmp1 = icmp sle i8 %x, -128 @@ -113,11 +95,8 @@ define i1 @relational_cmp_unsigned_max(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @relational_cmp_unsigned_max( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -1 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -1 ; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP4]] ; start: %cmp1 = icmp uge i8 %x, 255 @@ -131,11 +110,8 @@ define i1 @relational_cmp_signed_max(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @relational_cmp_signed_max( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 127 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 127 ; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP4]] ; start: %cmp1 = icmp sge i8 %x, 127 @@ -151,11 +127,9 @@ define i1 @compare_signed_max_multiuse(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_signed_max_multiuse( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 127 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 127 ; CHECK-NEXT: [[TMP4:%.*]] = icmp sgt i8 [[X]], [[Y]] ; CHECK-NEXT: call void @use(i1 [[TMP4]]) -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP4]] +; CHECK-NEXT: [[RESULT:%.*]] = icmp sgt i8 [[X]], [[Y]] ; CHECK-NEXT: ret i1 [[RESULT]] ; start: @@ -171,10 +145,7 @@ define i1 @compare_signed_min_samesign(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_signed_min_samesign( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], -128 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -128 -; CHECK-NEXT: [[CMP3:%.*]] = icmp samesign slt i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: [[RESULT:%.*]] = icmp slt i8 [[X]], [[Y]] ; CHECK-NEXT: ret i1 [[RESULT]] ; start: @@ -189,10 +160,7 @@ define i1 @compare_flipped(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_flipped( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[X]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 -; CHECK-NEXT: [[CMP3:%.*]] = icmp ugt i8 [[Y]], [[X]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]] ; CHECK-NEXT: ret i1 [[RESULT]] ; start: @@ -207,11 +175,8 @@ define i1 @compare_swapped(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_swapped( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i8 [[X]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], 0 ; CHECK-NEXT: [[RESULT:%.*]] = icmp ult i8 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT1:%.*]] = select i1 [[CMP1_NOT]], i1 [[CMP2]], i1 [[RESULT]] -; CHECK-NEXT: ret i1 [[RESULT1]] +; CHECK-NEXT: ret i1 [[RESULT]] ; start: %cmp1 = icmp ne i8 %x, 0 @@ -225,10 +190,7 @@ define i1 @compare_swapped_flipped_unsigned_max(i8 %x, i8 %y) { ; CHECK-LABEL: define i1 @compare_swapped_flipped_unsigned_max( ; CHECK-SAME: i8 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq i8 [[X]], -1 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i8 [[Y]], -1 -; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i8 [[Y]], [[X]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1_NOT]], i1 [[CMP2]], i1 [[CMP3]] +; CHECK-NEXT: [[RESULT:%.*]] = icmp ugt i8 [[X]], [[Y]] ; CHECK-NEXT: ret i1 [[RESULT]] ; start: @@ -243,11 +205,8 @@ define i1 @compare_unsigned_min_illegal_type(i9 %x, i9 %y) { ; CHECK-LABEL: define i1 @compare_unsigned_min_illegal_type( ; CHECK-SAME: i9 [[X:%.*]], i9 [[Y:%.*]]) { ; CHECK-NEXT: [[START:.*:]] -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i9 [[X]], 0 -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i9 [[Y]], 0 ; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i9 [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 [[TMP2]] -; CHECK-NEXT: ret i1 [[RESULT]] +; CHECK-NEXT: ret i1 [[TMP2]] ; start: %cmp1 = icmp eq i9 %x, 0 @@ -275,11 +234,8 @@ start: define <2 x i1> @compare_vector(<2 x i8> %x, <2 x i8> %y) { ; CHECK-LABEL: define <2 x i1> @compare_vector( ; CHECK-SAME: <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]]) { -; CHECK-NEXT: [[CMP1:%.*]] = icmp eq <2 x i8> [[X]], zeroinitializer -; CHECK-NEXT: [[CMP2:%.*]] = icmp ne <2 x i8> [[Y]], zeroinitializer ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <2 x i8> [[X]], [[Y]] -; CHECK-NEXT: [[RESULT:%.*]] = select <2 x i1> [[CMP1]], <2 x i1> [[CMP2]], <2 x i1> [[TMP1]] -; CHECK-NEXT: ret <2 x i1> [[RESULT]] +; CHECK-NEXT: ret <2 x i1> [[TMP1]] ; %cmp1 = icmp eq <2 x i8> %x, zeroinitializer %cmp2 = icmp ne <2 x i8> %y, zeroinitializer