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