|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
2 | 2 | ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
|
3 | 3 |
|
| 4 | +declare void @use(i8) |
| 5 | +declare void @use_i1(i1) |
| 6 | + |
4 | 7 | define i32 @select_0_or_1_from_bool(i1 %x) {
|
5 | 8 | ; CHECK-LABEL: @select_0_or_1_from_bool(
|
6 | 9 | ; CHECK-NEXT: [[NOT_X:%.*]] = xor i1 [[X:%.*]], true
|
@@ -280,8 +283,6 @@ define i8 @reassoc_shl1_commute3(i8 %px, i8 %py) {
|
280 | 283 | ret i8 %r
|
281 | 284 | }
|
282 | 285 |
|
283 |
| -declare void @use(i8) |
284 |
| - |
285 | 286 | define i8 @reassoc_shl1_extra_use(i8 %x, i8 %y) {
|
286 | 287 | ; CHECK-LABEL: @reassoc_shl1_extra_use(
|
287 | 288 | ; CHECK-NEXT: [[A:%.*]] = add i8 [[Y:%.*]], [[X:%.*]]
|
@@ -2729,3 +2730,129 @@ define i32 @floor_sdiv_wrong_op(i32 %x, i32 %y) {
|
2729 | 2730 | %r = add i32 %d, %s
|
2730 | 2731 | ret i32 %r
|
2731 | 2732 | }
|
| 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