Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/InstCombine/icmp-of-or-x.ll
Show All 26 Lines | ; | ||||
ret <2 x i1> %r | ret <2 x i1> %r | ||||
} | } | ||||
define <2 x i1> @or_slt_pos(<2 x i8> %xx, <2 x i8> %yy, <2 x i8> %z) { | define <2 x i1> @or_slt_pos(<2 x i8> %xx, <2 x i8> %yy, <2 x i8> %z) { | ||||
; CHECK-LABEL: @or_slt_pos( | ; CHECK-LABEL: @or_slt_pos( | ||||
; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]] | ; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]] | ||||
; CHECK-NEXT: [[Y:%.*]] = and <2 x i8> [[YY:%.*]], <i8 127, i8 127> | ; CHECK-NEXT: [[Y:%.*]] = and <2 x i8> [[YY:%.*]], <i8 127, i8 127> | ||||
; CHECK-NEXT: [[XN1:%.*]] = or <2 x i8> [[X]], [[Y]] | ; CHECK-NEXT: [[XN1:%.*]] = or <2 x i8> [[X]], [[Y]] | ||||
; CHECK-NEXT: [[R:%.*]] = icmp slt <2 x i8> [[X]], [[XN1]] | ; CHECK-NEXT: [[R:%.*]] = icmp ne <2 x i8> [[X]], [[XN1]] | ||||
; CHECK-NEXT: ret <2 x i1> [[R]] | ; CHECK-NEXT: ret <2 x i1> [[R]] | ||||
; | ; | ||||
%x = add <2 x i8> %xx, %z | %x = add <2 x i8> %xx, %z | ||||
%y = and <2 x i8> %yy, <i8 127, i8 127> | %y = and <2 x i8> %yy, <i8 127, i8 127> | ||||
%xn1 = or <2 x i8> %x, %y | %xn1 = or <2 x i8> %x, %y | ||||
%r = icmp slt <2 x i8> %x, %xn1 | %r = icmp slt <2 x i8> %x, %xn1 | ||||
ret <2 x i1> %r | ret <2 x i1> %r | ||||
} | } | ||||
define i1 @or_sle_pos(i8 %x, i8 %y) { | define i1 @or_sle_pos(i8 %x, i8 %y) { | ||||
; CHECK-LABEL: @or_sle_pos( | ; CHECK-LABEL: @or_sle_pos( | ||||
; CHECK-NEXT: [[NS:%.*]] = icmp sgt i8 [[Y:%.*]], -1 | ; CHECK-NEXT: [[NS:%.*]] = icmp sgt i8 [[Y:%.*]], -1 | ||||
; CHECK-NEXT: call void @llvm.assume(i1 [[NS]]) | ; CHECK-NEXT: call void @llvm.assume(i1 [[NS]]) | ||||
; CHECK-NEXT: [[XN1:%.*]] = or i8 [[X:%.*]], [[Y]] | ; CHECK-NEXT: [[XN1:%.*]] = or i8 [[X:%.*]], [[Y]] | ||||
; CHECK-NEXT: [[R:%.*]] = icmp sle i8 [[XN1]], [[X]] | ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[XN1]], [[X]] | ||||
; CHECK-NEXT: ret i1 [[R]] | ; CHECK-NEXT: ret i1 [[R]] | ||||
; | ; | ||||
%ns = icmp sge i8 %y, 0 | %ns = icmp sge i8 %y, 0 | ||||
call void @llvm.assume(i1 %ns) | call void @llvm.assume(i1 %ns) | ||||
%xn1 = or i8 %x, %y | %xn1 = or i8 %x, %y | ||||
%r = icmp sle i8 %xn1, %x | %r = icmp sle i8 %xn1, %x | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | ; | ||||
%xn1 = or <2 x i8> %x, %y | %xn1 = or <2 x i8> %x, %y | ||||
%r = icmp ne <2 x i8> %xn1, %x | %r = icmp ne <2 x i8> %xn1, %x | ||||
call void @use.v2i8(<2 x i8> %xn1) | call void @use.v2i8(<2 x i8> %xn1) | ||||
ret <2 x i1> %r | ret <2 x i1> %r | ||||
} | } | ||||
define i1 @or_slt_intmin(i8 %x) { | define i1 @or_slt_intmin(i8 %x) { | ||||
; CHECK-LABEL: @or_slt_intmin( | ; CHECK-LABEL: @or_slt_intmin( | ||||
; CHECK-NEXT: [[XN1:%.*]] = or i8 [[X:%.*]], -128 | ; CHECK-NEXT: [[R:%.*]] = icmp sgt i8 [[X:%.*]], -1 | ||||
; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[XN1]], [[X]] | |||||
; CHECK-NEXT: ret i1 [[R]] | ; CHECK-NEXT: ret i1 [[R]] | ||||
; | ; | ||||
%xn1 = or i8 %x, 128 | %xn1 = or i8 %x, 128 | ||||
%r = icmp slt i8 %xn1, %x | %r = icmp slt i8 %xn1, %x | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define <2 x i1> @or_slt_intmin_2(<2 x i8> %xx, <2 x i8> %z) { | define <2 x i1> @or_slt_intmin_2(<2 x i8> %xx, <2 x i8> %z) { | ||||
; CHECK-LABEL: @or_slt_intmin_2( | ; CHECK-LABEL: @or_slt_intmin_2( | ||||
; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]] | ; CHECK-NEXT: ret <2 x i1> zeroinitializer | ||||
; CHECK-NEXT: [[XN1:%.*]] = or <2 x i8> [[X]], <i8 -128, i8 -128> | |||||
; CHECK-NEXT: [[R:%.*]] = icmp slt <2 x i8> [[X]], [[XN1]] | |||||
; CHECK-NEXT: ret <2 x i1> [[R]] | |||||
; | ; | ||||
%x = add <2 x i8> %xx, %z | %x = add <2 x i8> %xx, %z | ||||
%xn1 = or <2 x i8> %x, <i8 128, i8 128> | %xn1 = or <2 x i8> %x, <i8 128, i8 128> | ||||
%r = icmp slt <2 x i8> %x, %xn1 | %r = icmp slt <2 x i8> %x, %xn1 | ||||
ret <2 x i1> %r | ret <2 x i1> %r | ||||
} | } | ||||
define i1 @or_sle_intmin_indirect_2(i8 %xx, i8 %C, i8 %z) { | define i1 @or_sle_intmin_indirect_2(i8 %xx, i8 %C, i8 %z) { | ||||
Show All 22 Lines | neg: | ||||
ret i1 %r | ret i1 %r | ||||
pos: | pos: | ||||
call void @barrier() | call void @barrier() | ||||
ret i1 0 | ret i1 0 | ||||
} | } | ||||
define i1 @or_sge_intmin(i8 %x) { | define i1 @or_sge_intmin(i8 %x) { | ||||
; CHECK-LABEL: @or_sge_intmin( | ; CHECK-LABEL: @or_sge_intmin( | ||||
; CHECK-NEXT: [[XN1:%.*]] = or i8 [[X:%.*]], -128 | ; CHECK-NEXT: [[R:%.*]] = icmp slt i8 [[X:%.*]], 0 | ||||
; CHECK-NEXT: [[R:%.*]] = icmp sge i8 [[XN1]], [[X]] | |||||
; CHECK-NEXT: ret i1 [[R]] | ; CHECK-NEXT: ret i1 [[R]] | ||||
; | ; | ||||
%xn1 = or i8 %x, 128 | %xn1 = or i8 %x, 128 | ||||
%r = icmp sge i8 %xn1, %x | %r = icmp sge i8 %xn1, %x | ||||
ret i1 %r | ret i1 %r | ||||
} | } | ||||
define i1 @or_sgt_intmin_indirect(i8 %x, i8 %C) { | define i1 @or_sgt_intmin_indirect(i8 %x, i8 %C) { | ||||
Show All 21 Lines | |||||
pos: | pos: | ||||
call void @barrier() | call void @barrier() | ||||
ret i1 0 | ret i1 0 | ||||
} | } | ||||
define <2 x i1> @or_sgt_intmin_2(<2 x i8> %xx, <2 x i8> %z) { | define <2 x i1> @or_sgt_intmin_2(<2 x i8> %xx, <2 x i8> %z) { | ||||
; CHECK-LABEL: @or_sgt_intmin_2( | ; CHECK-LABEL: @or_sgt_intmin_2( | ||||
; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]] | ; CHECK-NEXT: [[X:%.*]] = add <2 x i8> [[XX:%.*]], [[Z:%.*]] | ||||
; CHECK-NEXT: [[XN1:%.*]] = or <2 x i8> [[X]], <i8 -128, i8 -128> | ; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[X]], <i8 -1, i8 -1> | ||||
; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i8> [[X]], [[XN1]] | |||||
; CHECK-NEXT: ret <2 x i1> [[R]] | ; CHECK-NEXT: ret <2 x i1> [[R]] | ||||
; | ; | ||||
%x = add <2 x i8> %xx, %z | %x = add <2 x i8> %xx, %z | ||||
%xn1 = or <2 x i8> %x, <i8 128, i8 128> | %xn1 = or <2 x i8> %x, <i8 128, i8 128> | ||||
%r = icmp sgt <2 x i8> %x, %xn1 | %r = icmp sgt <2 x i8> %x, %xn1 | ||||
ret <2 x i1> %r | ret <2 x i1> %r | ||||
} | } |