Skip to content

Commit 625e666

Browse files
committed
[InstCombine] add tests for signum (spaceship) variant; NFC
1 parent caf393d commit 625e666

File tree

1 file changed

+129
-2
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+129
-2
lines changed

llvm/test/Transforms/InstCombine/add.ll

Lines changed: 129 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
33

4+
declare void @use(i8)
5+
declare void @use_i1(i1)
6+
47
define i32 @select_0_or_1_from_bool(i1 %x) {
58
; CHECK-LABEL: @select_0_or_1_from_bool(
69
; CHECK-NEXT: [[NOT_X:%.*]] = xor i1 [[X:%.*]], true
@@ -280,8 +283,6 @@ define i8 @reassoc_shl1_commute3(i8 %px, i8 %py) {
280283
ret i8 %r
281284
}
282285

283-
declare void @use(i8)
284-
285286
define i8 @reassoc_shl1_extra_use(i8 %x, i8 %y) {
286287
; CHECK-LABEL: @reassoc_shl1_extra_use(
287288
; CHECK-NEXT: [[A:%.*]] = add i8 [[Y:%.*]], [[X:%.*]]
@@ -2729,3 +2730,129 @@ define i32 @floor_sdiv_wrong_op(i32 %x, i32 %y) {
27292730
%r = add i32 %d, %s
27302731
ret i32 %r
27312732
}
2733+
2734+
define i8 @signum_i8_i8(i8 %x) {
2735+
; CHECK-LABEL: @signum_i8_i8(
2736+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[X:%.*]], 0
2737+
; CHECK-NEXT: [[ZGT0:%.*]] = zext i1 [[SGT0]] to i8
2738+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X]], 7
2739+
; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[SIGNBIT]], [[ZGT0]]
2740+
; CHECK-NEXT: ret i8 [[R]]
2741+
;
2742+
%sgt0 = icmp sgt i8 %x, 0
2743+
%zgt0 = zext i1 %sgt0 to i8
2744+
%signbit = ashr i8 %x, 7
2745+
%r = add i8 %zgt0, %signbit
2746+
ret i8 %r
2747+
}
2748+
2749+
define i8 @signum_i8_i8_use1(i8 %x) {
2750+
; CHECK-LABEL: @signum_i8_i8_use1(
2751+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[X:%.*]], 0
2752+
; CHECK-NEXT: [[ZGT0:%.*]] = zext i1 [[SGT0]] to i8
2753+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X]], 7
2754+
; CHECK-NEXT: call void @use(i8 [[SIGNBIT]])
2755+
; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[SIGNBIT]], [[ZGT0]]
2756+
; CHECK-NEXT: ret i8 [[R]]
2757+
;
2758+
%sgt0 = icmp sgt i8 %x, 0
2759+
%zgt0 = zext i1 %sgt0 to i8
2760+
%signbit = ashr i8 %x, 7
2761+
call void @use(i8 %signbit)
2762+
%r = add i8 %zgt0, %signbit
2763+
ret i8 %r
2764+
}
2765+
2766+
define i8 @signum_i8_i8_use2(i8 %x) {
2767+
; CHECK-LABEL: @signum_i8_i8_use2(
2768+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[X:%.*]], 0
2769+
; CHECK-NEXT: [[ZGT0:%.*]] = zext i1 [[SGT0]] to i8
2770+
; CHECK-NEXT: call void @use(i8 [[ZGT0]])
2771+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X]], 7
2772+
; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[SIGNBIT]], [[ZGT0]]
2773+
; CHECK-NEXT: ret i8 [[R]]
2774+
;
2775+
%sgt0 = icmp sgt i8 %x, 0
2776+
%zgt0 = zext i1 %sgt0 to i8
2777+
call void @use(i8 %zgt0)
2778+
%signbit = ashr i8 %x, 7
2779+
%r = add i8 %zgt0, %signbit
2780+
ret i8 %r
2781+
}
2782+
2783+
define i8 @signum_i8_i8_use3(i8 %x) {
2784+
; CHECK-LABEL: @signum_i8_i8_use3(
2785+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[X:%.*]], 0
2786+
; CHECK-NEXT: call void @use_i1(i1 [[SGT0]])
2787+
; CHECK-NEXT: [[ZGT0:%.*]] = zext i1 [[SGT0]] to i8
2788+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X]], 7
2789+
; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[SIGNBIT]], [[ZGT0]]
2790+
; CHECK-NEXT: ret i8 [[R]]
2791+
;
2792+
%sgt0 = icmp sgt i8 %x, 0
2793+
call void @use_i1(i1 %sgt0)
2794+
%zgt0 = zext i1 %sgt0 to i8
2795+
%signbit = ashr i8 %x, 7
2796+
%r = add i8 %zgt0, %signbit
2797+
ret i8 %r
2798+
}
2799+
2800+
define <2 x i5> @signum_v2i5_v2i5(<2 x i5> %x) {
2801+
; CHECK-LABEL: @signum_v2i5_v2i5(
2802+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt <2 x i5> [[X:%.*]], zeroinitializer
2803+
; CHECK-NEXT: [[ZGT0:%.*]] = zext <2 x i1> [[SGT0]] to <2 x i5>
2804+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr <2 x i5> [[X]], <i5 4, i5 poison>
2805+
; CHECK-NEXT: [[R:%.*]] = add <2 x i5> [[SIGNBIT]], [[ZGT0]]
2806+
; CHECK-NEXT: ret <2 x i5> [[R]]
2807+
;
2808+
%sgt0 = icmp sgt <2 x i5> %x, zeroinitializer
2809+
%zgt0 = zext <2 x i1> %sgt0 to <2 x i5>
2810+
%signbit = ashr <2 x i5> %x, <i5 4, i5 poison>
2811+
%r = add <2 x i5> %signbit, %zgt0
2812+
ret <2 x i5> %r
2813+
}
2814+
2815+
define i8 @signum_i8_i8_wrong_sh_amt(i8 %x) {
2816+
; CHECK-LABEL: @signum_i8_i8_wrong_sh_amt(
2817+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[X:%.*]], 0
2818+
; CHECK-NEXT: [[ZGT0:%.*]] = zext i1 [[SGT0]] to i8
2819+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X]], 6
2820+
; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[SIGNBIT]], [[ZGT0]]
2821+
; CHECK-NEXT: ret i8 [[R]]
2822+
;
2823+
%sgt0 = icmp sgt i8 %x, 0
2824+
%zgt0 = zext i1 %sgt0 to i8
2825+
%signbit = ashr i8 %x, 6
2826+
%r = add i8 %zgt0, %signbit
2827+
ret i8 %r
2828+
}
2829+
2830+
define i8 @signum_i8_i8_wrong_ext(i8 %x) {
2831+
; CHECK-LABEL: @signum_i8_i8_wrong_ext(
2832+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[X:%.*]], 0
2833+
; CHECK-NEXT: [[ZGT0:%.*]] = sext i1 [[SGT0]] to i8
2834+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X]], 7
2835+
; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[SIGNBIT]], [[ZGT0]]
2836+
; CHECK-NEXT: ret i8 [[R]]
2837+
;
2838+
%sgt0 = icmp sgt i8 %x, 0
2839+
%zgt0 = sext i1 %sgt0 to i8
2840+
%signbit = ashr i8 %x, 7
2841+
%r = add i8 %zgt0, %signbit
2842+
ret i8 %r
2843+
}
2844+
2845+
define i8 @signum_i8_i8_wrong_pred(i8 %x) {
2846+
; CHECK-LABEL: @signum_i8_i8_wrong_pred(
2847+
; CHECK-NEXT: [[SGT0:%.*]] = icmp sgt i8 [[X:%.*]], -1
2848+
; CHECK-NEXT: [[ZGT0:%.*]] = zext i1 [[SGT0]] to i8
2849+
; CHECK-NEXT: [[SIGNBIT:%.*]] = ashr i8 [[X]], 7
2850+
; CHECK-NEXT: [[R:%.*]] = add nsw i8 [[SIGNBIT]], [[ZGT0]]
2851+
; CHECK-NEXT: ret i8 [[R]]
2852+
;
2853+
%sgt0 = icmp sge i8 %x, 0
2854+
%zgt0 = zext i1 %sgt0 to i8
2855+
%signbit = ashr i8 %x, 7
2856+
%r = add i8 %zgt0, %signbit
2857+
ret i8 %r
2858+
}

0 commit comments

Comments
 (0)