forked from OSchip/llvm-project
[InstCombine] add tests for add/sub-of-shl; NFC
This commit is contained in:
parent
dbac20bb6b
commit
1dd4c4e0a8
|
@ -0,0 +1,281 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
|
||||
declare void @use8(i8)
|
||||
|
||||
define i6 @add_shl_same_amount(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl i6 %x, %z
|
||||
%ys = shl i6 %y, %z
|
||||
%diff = add i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define <2 x i4> @add_shl_same_amount_nsw(<2 x i4> %x, <2 x i4> %y, <2 x i4> %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_nsw(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nsw <2 x i4> [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nsw <2 x i4> [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add nsw <2 x i4> [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret <2 x i4> [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw <2 x i4> %x, %z
|
||||
%ys = shl nsw <2 x i4> %y, %z
|
||||
%diff = add nsw <2 x i4> %xs, %ys
|
||||
ret <2 x i4> %diff
|
||||
}
|
||||
|
||||
define i64 @add_shl_same_amount_nuw(i64 %x, i64 %y, i64 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_nuw(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i64 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw i64 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add nuw i64 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i64 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i64 %x, %z
|
||||
%ys = shl nuw i64 %y, %z
|
||||
%diff = add nuw i64 %xs, %ys
|
||||
ret i64 %diff
|
||||
}
|
||||
|
||||
define i8 @add_shl_same_amount_nsw_extra_use1(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_nsw_extra_use1(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw nsw i8 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[XS]])
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw nsw i8 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add nsw i8 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i8 [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw nuw i8 %x, %z
|
||||
call void @use8(i8 %xs)
|
||||
%ys = shl nsw nuw i8 %y, %z
|
||||
%diff = add nsw i8 %xs, %ys
|
||||
ret i8 %diff
|
||||
}
|
||||
|
||||
define i8 @add_shl_same_amount_nuw_extra_use2(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_nuw_extra_use2(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i8 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw nsw i8 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[YS]])
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add nuw nsw i8 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i8 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i8 %x, %z
|
||||
%ys = shl nsw nuw i8 %y, %z
|
||||
call void @use8(i8 %ys)
|
||||
%diff = add nsw nuw i8 %xs, %ys
|
||||
ret i8 %diff
|
||||
}
|
||||
|
||||
define i8 @add_shl_same_amount_nsw_nuw_extra_use3(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_nsw_nuw_extra_use3(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw nsw i8 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[XS]])
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw nsw i8 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[YS]])
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add nuw nsw i8 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i8 [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw nuw i8 %x, %z
|
||||
call void @use8(i8 %xs)
|
||||
%ys = shl nsw nuw i8 %y, %z
|
||||
call void @use8(i8 %ys)
|
||||
%diff = add nsw nuw i8 %xs, %ys
|
||||
ret i8 %diff
|
||||
}
|
||||
|
||||
define i6 @add_shl_same_amount_partial_nsw1(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_partial_nsw1(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nsw i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nsw i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw i6 %x, %z
|
||||
%ys = shl nsw i6 %y, %z
|
||||
%diff = add i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define i6 @add_shl_same_amount_partial_nsw2(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_partial_nsw2(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nsw i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add nsw i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl i6 %x, %z
|
||||
%ys = shl nsw i6 %y, %z
|
||||
%diff = add nsw i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define i6 @add_shl_same_amount_partial_nuw1(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_partial_nuw1(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i6 %x, %z
|
||||
%ys = shl nuw i6 %y, %z
|
||||
%diff = add i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define i6 @add_shl_same_amount_partial_nuw2(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @add_shl_same_amount_partial_nuw2(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = add nuw i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i6 %x, %z
|
||||
%ys = shl i6 %y, %z
|
||||
%diff = add nuw i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define i6 @sub_shl_same_amount(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl i6 %x, %z
|
||||
%ys = shl i6 %y, %z
|
||||
%diff = sub i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define <2 x i4> @sub_shl_same_amount_nsw(<2 x i4> %x, <2 x i4> %y, <2 x i4> %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_nsw(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nsw <2 x i4> [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nsw <2 x i4> [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub nsw <2 x i4> [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret <2 x i4> [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw <2 x i4> %x, %z
|
||||
%ys = shl nsw <2 x i4> %y, %z
|
||||
%diff = sub nsw <2 x i4> %xs, %ys
|
||||
ret <2 x i4> %diff
|
||||
}
|
||||
|
||||
define i64 @sub_shl_same_amount_nuw(i64 %x, i64 %y, i64 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_nuw(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i64 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw i64 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub nuw i64 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i64 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i64 %x, %z
|
||||
%ys = shl nuw i64 %y, %z
|
||||
%diff = sub nuw i64 %xs, %ys
|
||||
ret i64 %diff
|
||||
}
|
||||
|
||||
define i8 @sub_shl_same_amount_nsw_extra_use1(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_nsw_extra_use1(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw nsw i8 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[XS]])
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw nsw i8 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub nsw i8 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i8 [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw nuw i8 %x, %z
|
||||
call void @use8(i8 %xs)
|
||||
%ys = shl nsw nuw i8 %y, %z
|
||||
%diff = sub nsw i8 %xs, %ys
|
||||
ret i8 %diff
|
||||
}
|
||||
|
||||
define i8 @sub_shl_same_amount_nuw_extra_use2(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_nuw_extra_use2(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i8 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw nsw i8 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[YS]])
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub nuw nsw i8 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i8 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i8 %x, %z
|
||||
%ys = shl nsw nuw i8 %y, %z
|
||||
call void @use8(i8 %ys)
|
||||
%diff = sub nsw nuw i8 %xs, %ys
|
||||
ret i8 %diff
|
||||
}
|
||||
|
||||
define i8 @sub_shl_same_amount_nsw_nuw_extra_use3(i8 %x, i8 %y, i8 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_nsw_nuw_extra_use3(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw nsw i8 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[XS]])
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw nsw i8 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: call void @use8(i8 [[YS]])
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub nuw nsw i8 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i8 [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw nuw i8 %x, %z
|
||||
call void @use8(i8 %xs)
|
||||
%ys = shl nsw nuw i8 %y, %z
|
||||
call void @use8(i8 %ys)
|
||||
%diff = sub nsw nuw i8 %xs, %ys
|
||||
ret i8 %diff
|
||||
}
|
||||
|
||||
define i6 @sub_shl_same_amount_partial_nsw1(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_partial_nsw1(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nsw i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nsw i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl nsw i6 %x, %z
|
||||
%ys = shl nsw i6 %y, %z
|
||||
%diff = sub i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define i6 @sub_shl_same_amount_partial_nsw2(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_partial_nsw2(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nsw i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub nsw i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl i6 %x, %z
|
||||
%ys = shl nsw i6 %y, %z
|
||||
%diff = sub nsw i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define i6 @sub_shl_same_amount_partial_nuw1(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_partial_nuw1(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl nuw i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i6 %x, %z
|
||||
%ys = shl nuw i6 %y, %z
|
||||
%diff = sub i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
||||
define i6 @sub_shl_same_amount_partial_nuw2(i6 %x, i6 %y, i6 %z) {
|
||||
; CHECK-LABEL: @sub_shl_same_amount_partial_nuw2(
|
||||
; CHECK-NEXT: [[XS:%.*]] = shl nuw i6 [[X:%.*]], [[Z:%.*]]
|
||||
; CHECK-NEXT: [[YS:%.*]] = shl i6 [[Y:%.*]], [[Z]]
|
||||
; CHECK-NEXT: [[DIFF:%.*]] = sub nuw i6 [[XS]], [[YS]]
|
||||
; CHECK-NEXT: ret i6 [[DIFF]]
|
||||
;
|
||||
%xs = shl nuw i6 %x, %z
|
||||
%ys = shl i6 %y, %z
|
||||
%diff = sub nuw i6 %xs, %ys
|
||||
ret i6 %diff
|
||||
}
|
||||
|
Loading…
Reference in New Issue