Home | History | Annotate | Download | only in InstSimplify
      1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
      2 ; RUN: opt < %s -instsimplify -S | FileCheck %s
      3 
      4 define i32 @negated_operand(i32 %x) {
      5 ; CHECK-LABEL: @negated_operand(
      6 ; CHECK-NEXT:    ret i32 0
      7 ;
      8   %negx = sub i32 0, %x
      9   %rem = srem i32 %negx, %x
     10   ret i32 %rem
     11 }
     12 
     13 define <2 x i32> @negated_operand_commute_vec(<2 x i32> %x) {
     14 ; CHECK-LABEL: @negated_operand_commute_vec(
     15 ; CHECK-NEXT:    ret <2 x i32> zeroinitializer
     16 ;
     17   %negx = sub <2 x i32> zeroinitializer, %x
     18   %rem = srem <2 x i32> %negx, %x
     19   ret <2 x i32> %rem
     20 }
     21 
     22 define i32 @knownnegation(i32 %x, i32 %y) {
     23 ; CHECK-LABEL: @knownnegation(
     24 ; CHECK-NEXT:    ret i32 0
     25 ;
     26   %xy = sub i32 %x, %y
     27   %yx = sub i32 %y, %x
     28   %rem = srem i32 %xy, %yx
     29   ret i32 %rem
     30 }
     31 
     32 define <2 x i32> @knownnegation_commute_vec(<2 x i32> %x, <2 x i32> %y) {
     33 ; CHECK-LABEL: @knownnegation_commute_vec(
     34 ; CHECK-NEXT:    ret <2 x i32> zeroinitializer
     35 ;
     36   %xy = sub <2 x i32> %x, %y
     37   %yx = sub <2 x i32> %y, %x
     38   %rem = srem <2 x i32> %xy, %yx
     39   ret <2 x i32> %rem
     40 }
     41 
     42 define <3 x i32> @negated_operand_vec_undef(<3 x i32> %x) {
     43 ; CHECK-LABEL: @negated_operand_vec_undef(
     44 ; CHECK-NEXT:    ret <3 x i32> zeroinitializer
     45 ;
     46   %negx = sub <3 x i32> <i32 0, i32 undef, i32 0>, %x
     47   %rem = srem <3 x i32> %negx, %x
     48   ret <3 x i32> %rem
     49 }
     50 
     51 define <2 x i32> @negated_operand_vec_nonsplat(<2 x i32> %x) {
     52 ; CHECK-LABEL: @negated_operand_vec_nonsplat(
     53 ; CHECK-NEXT:    [[NEGX:%.*]] = sub <2 x i32> <i32 0, i32 1>, [[X:%.*]]
     54 ; CHECK-NEXT:    [[REM:%.*]] = srem <2 x i32> [[NEGX]], [[X]]
     55 ; CHECK-NEXT:    ret <2 x i32> [[REM]]
     56 ;
     57   %negx = sub <2 x i32> <i32 0, i32 1>, %x ; not 0, don't fold
     58   %rem = srem <2 x i32> %negx, %x
     59   ret <2 x i32> %rem
     60 }
     61 
     62 define i32 @negated_operand_commute(i32 %x) {
     63 ; CHECK-LABEL: @negated_operand_commute(
     64 ; CHECK-NEXT:    ret i32 0
     65 ;
     66   %negx = sub i32 0, %x
     67   %rem = srem i32 %x, %negx
     68   ret i32 %rem
     69 }
     70