1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instsimplify -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @nonzero_vec_splat(<2 x i32> %x) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonzero_vec_splat( 6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> zeroinitializer 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker %y = or <2 x i32> %x, <i32 1, i32 1> 9*9880d681SAndroid Build Coastguard Worker %c = icmp eq <2 x i32> %y, zeroinitializer 10*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @nonzero_vec_nonsplat(<2 x i32> %x) { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonzero_vec_nonsplat( 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 16*9880d681SAndroid Build Coastguard Worker; 17*9880d681SAndroid Build Coastguard Worker %y = or <2 x i32> %x, <i32 2, i32 1> 18*9880d681SAndroid Build Coastguard Worker %c = icmp ne <2 x i32> %y, zeroinitializer 19*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @nonzero_vec_undef_elt(<2 x i32> %x) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonzero_vec_undef_elt( 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> zeroinitializer 25*9880d681SAndroid Build Coastguard Worker; 26*9880d681SAndroid Build Coastguard Worker %y = or <2 x i32> %x, <i32 undef, i32 1> 27*9880d681SAndroid Build Coastguard Worker %c = icmp eq <2 x i32> %y, zeroinitializer 28*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @may_be_zero_vec(<2 x i32> %x) { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @may_be_zero_vec( 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[Y:%.*]] = or <2 x i32> %x, <i32 0, i32 1> 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[C:%.*]] = icmp ne <2 x i32> [[Y]], zeroinitializer 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> [[C]] 36*9880d681SAndroid Build Coastguard Worker; 37*9880d681SAndroid Build Coastguard Worker %y = or <2 x i32> %x, <i32 0, i32 1> 38*9880d681SAndroid Build Coastguard Worker %c = icmp ne <2 x i32> %y, zeroinitializer 39*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; Multiplies of non-zero numbers are non-zero if there is no unsigned overflow. 43*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @nonzero_vec_mul_nuw(<2 x i32> %x, <2 x i32> %y) { 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonzero_vec_mul_nuw( 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> zeroinitializer 46*9880d681SAndroid Build Coastguard Worker; 47*9880d681SAndroid Build Coastguard Worker %xnz = or <2 x i32> %x, <i32 1, i32 2> 48*9880d681SAndroid Build Coastguard Worker %ynz = or <2 x i32> %y, <i32 3, i32 undef> 49*9880d681SAndroid Build Coastguard Worker %m = mul nuw <2 x i32> %xnz, %ynz 50*9880d681SAndroid Build Coastguard Worker %c = icmp eq <2 x i32> %m, zeroinitializer 51*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; Multiplies of non-zero numbers are non-zero if there is no signed overflow. 55*9880d681SAndroid Build Coastguard Workerdefine <2 x i1> @nonzero_vec_mul_nsw(<2 x i32> %x, <2 x i32> %y) { 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonzero_vec_mul_nsw( 57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 58*9880d681SAndroid Build Coastguard Worker; 59*9880d681SAndroid Build Coastguard Worker %xnz = or <2 x i32> %x, <i32 undef, i32 2> 60*9880d681SAndroid Build Coastguard Worker %ynz = or <2 x i32> %y, <i32 3, i32 4> 61*9880d681SAndroid Build Coastguard Worker %m = mul nsw <2 x i32> %xnz, %ynz 62*9880d681SAndroid Build Coastguard Worker %c = icmp ne <2 x i32> %m, zeroinitializer 63*9880d681SAndroid Build Coastguard Worker ret <2 x i1> %c 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66