xref: /llvm-project/llvm/test/Transforms/PhaseOrdering/min-max-abs-cse.ll (revision 43acb61a08fffada31fb2e20e45fcc8492ef76b9)
10ad6e726SSanjay Patel; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
20ad6e726SSanjay Patel; RUN: opt < %s -S -O1 | FileCheck %s
30ad6e726SSanjay Patel; RUN: opt -passes='default<O1>' -S < %s | FileCheck %s
40ad6e726SSanjay Patel
50ad6e726SSanjay Patel; In all tests, expect instcombine to canonicalize the select patterns
60ad6e726SSanjay Patel; for min/max/abs to allow CSE and subsequent simplification.
70ad6e726SSanjay Patel
8b1e513aeSSanjay Patel; TODO:
9b1e513aeSSanjay Patel; This should be reduced to 0, but we are missing some
10b1e513aeSSanjay Patel; fold(s) in instcombine.
110ad6e726SSanjay Patel
120ad6e726SSanjay Pateldefine i8 @smax_nsw(i8 %a, i8 %b) {
130ad6e726SSanjay Patel; CHECK-LABEL: @smax_nsw(
14b48fe158SSanjay Patel; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i8 [[A:%.*]], [[B:%.*]]
15b48fe158SSanjay Patel; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i8 [[A]], [[B]]
16b48fe158SSanjay Patel; CHECK-NEXT:    [[M1:%.*]] = select i1 [[CMP1]], i8 0, i8 [[SUB]]
17*43acb61aSFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8 @llvm.smax.i8(i8 [[SUB]], i8 0)
18*43acb61aSFlorian Hahn; CHECK-NEXT:    [[R:%.*]] = sub i8 [[TMP1]], [[M1]]
19b48fe158SSanjay Patel; CHECK-NEXT:    ret i8 [[R]]
200ad6e726SSanjay Patel;
210ad6e726SSanjay Patel  %sub = sub nsw i8 %a, %b
220ad6e726SSanjay Patel  %cmp1 = icmp slt i8 %a, %b
230ad6e726SSanjay Patel  %cmp2 = icmp sgt i8 %sub, 0
240ad6e726SSanjay Patel  %m1 = select i1 %cmp1, i8 0, i8 %sub
250ad6e726SSanjay Patel  %m2 = select i1 %cmp2, i8 %sub, i8 0
260ad6e726SSanjay Patel  %r = sub i8 %m2, %m1
270ad6e726SSanjay Patel  ret i8 %r
280ad6e726SSanjay Patel}
290ad6e726SSanjay Patel
300ad6e726SSanjay Patel; or (abs a), (abs a) --> abs a
310ad6e726SSanjay Patel
320ad6e726SSanjay Pateldefine i8 @abs_swapped(i8 %a) {
330ad6e726SSanjay Patel; CHECK-LABEL: @abs_swapped(
34*43acb61aSFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8 @llvm.abs.i8(i8 [[A:%.*]], i1 false)
35*43acb61aSFlorian Hahn; CHECK-NEXT:    ret i8 [[TMP1]]
360ad6e726SSanjay Patel;
370ad6e726SSanjay Patel  %neg = sub i8 0, %a
380ad6e726SSanjay Patel  %cmp1 = icmp sgt i8 %a, 0
390ad6e726SSanjay Patel  %cmp2 = icmp slt i8 %a, 0
400ad6e726SSanjay Patel  %m1 = select i1 %cmp1, i8 %a, i8 %neg
410ad6e726SSanjay Patel  %m2 = select i1 %cmp2, i8 %neg, i8 %a
420ad6e726SSanjay Patel  %r = or i8 %m2, %m1
430ad6e726SSanjay Patel  ret i8 %r
440ad6e726SSanjay Patel}
450ad6e726SSanjay Patel
460ad6e726SSanjay Patel; xor (nabs a), (nabs a) --> 0
470ad6e726SSanjay Patel
480ad6e726SSanjay Pateldefine i8 @nabs_swapped(i8 %a) {
490ad6e726SSanjay Patel; CHECK-LABEL: @nabs_swapped(
500ad6e726SSanjay Patel; CHECK-NEXT:    ret i8 0
510ad6e726SSanjay Patel;
520ad6e726SSanjay Patel  %neg = sub i8 0, %a
530ad6e726SSanjay Patel  %cmp1 = icmp slt i8 %a, 0
540ad6e726SSanjay Patel  %cmp2 = icmp sgt i8 %a, 0
550ad6e726SSanjay Patel  %m1 = select i1 %cmp1, i8 %a, i8 %neg
560ad6e726SSanjay Patel  %m2 = select i1 %cmp2, i8 %neg, i8 %a
570ad6e726SSanjay Patel  %r = xor i8 %m2, %m1
580ad6e726SSanjay Patel  ret i8 %r
590ad6e726SSanjay Patel}
600ad6e726SSanjay Patel
610ad6e726SSanjay Patel; xor (abs a), (abs a) --> 0
620ad6e726SSanjay Patel
630ad6e726SSanjay Pateldefine i8 @abs_different_constants(i8 %a) {
640ad6e726SSanjay Patel; CHECK-LABEL: @abs_different_constants(
650ad6e726SSanjay Patel; CHECK-NEXT:    ret i8 0
660ad6e726SSanjay Patel;
670ad6e726SSanjay Patel  %neg = sub i8 0, %a
680ad6e726SSanjay Patel  %cmp1 = icmp sgt i8 %a, -1
690ad6e726SSanjay Patel  %cmp2 = icmp slt i8 %a, 0
700ad6e726SSanjay Patel  %m1 = select i1 %cmp1, i8 %a, i8 %neg
710ad6e726SSanjay Patel  %m2 = select i1 %cmp2, i8 %neg, i8 %a
720ad6e726SSanjay Patel  %r = xor i8 %m2, %m1
730ad6e726SSanjay Patel  ret i8 %r
740ad6e726SSanjay Patel}
750ad6e726SSanjay Patel
760ad6e726SSanjay Patel; or (nabs a), (nabs a) --> nabs a
770ad6e726SSanjay Patel
780ad6e726SSanjay Pateldefine i8 @nabs_different_constants(i8 %a) {
790ad6e726SSanjay Patel; CHECK-LABEL: @nabs_different_constants(
80bfb9b8e0SSanjay Patel; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8 @llvm.abs.i8(i8 [[A:%.*]], i1 false)
81*43acb61aSFlorian Hahn; CHECK-NEXT:    [[M1:%.*]] = sub i8 0, [[TMP1]]
820ad6e726SSanjay Patel; CHECK-NEXT:    ret i8 [[M1]]
830ad6e726SSanjay Patel;
840ad6e726SSanjay Patel  %neg = sub i8 0, %a
850ad6e726SSanjay Patel  %cmp1 = icmp slt i8 %a, 0
860ad6e726SSanjay Patel  %cmp2 = icmp sgt i8 %a, -1
870ad6e726SSanjay Patel  %m1 = select i1 %cmp1, i8 %a, i8 %neg
880ad6e726SSanjay Patel  %m2 = select i1 %cmp2, i8 %neg, i8 %a
890ad6e726SSanjay Patel  %r = or i8 %m2, %m1
900ad6e726SSanjay Patel  ret i8 %r
910ad6e726SSanjay Patel}
92