[tests] Add coverage for cases we can drop flags to propagate freeze without cost

This commit is contained in:
Philip Reames 2021-10-12 12:01:36 -07:00
parent 15692fd6b5
commit 357b8d7ddb
1 changed files with 124 additions and 2 deletions

View File

@ -119,8 +119,6 @@ define i1 @early_freeze_test2(i32* %ptr) {
ret i1 %cond.fr
}
; add can overflows, so we cannot move freeze beyond add
define i32 @early_freeze_test3(i32 %v1) {
; CHECK-LABEL: @early_freeze_test3(
; CHECK-NEXT: [[V2:%.*]] = shl i32 [[V1:%.*]], 1
@ -221,3 +219,127 @@ bb1:
end:
ret void
}
define i32 @propagate_drop_flags_add(i32 %arg) {
; CHECK-LABEL: @propagate_drop_flags_add(
; CHECK-NEXT: [[V1:%.*]] = add nuw nsw i32 [[ARG:%.*]], 2
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = add nsw nuw i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_flags_sub(i32 %arg) {
; CHECK-LABEL: @propagate_drop_flags_sub(
; CHECK-NEXT: [[V1:%.*]] = add nsw i32 [[ARG:%.*]], -2
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = sub nsw nuw i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_flags_mul(i32 %arg) {
; CHECK-LABEL: @propagate_drop_flags_mul(
; CHECK-NEXT: [[V1:%.*]] = shl nuw nsw i32 [[ARG:%.*]], 1
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = mul nsw nuw i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_flags_udiv(i32 %arg) {
; CHECK-LABEL: @propagate_drop_flags_udiv(
; CHECK-NEXT: [[V1:%.*]] = lshr exact i32 [[ARG:%.*]], 1
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = udiv exact i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_flags_sdiv(i32 %arg) {
; CHECK-LABEL: @propagate_drop_flags_sdiv(
; CHECK-NEXT: [[V1:%.*]] = ashr exact i32 [[ARG:%.*]], 1
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = sdiv exact i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_shl1(i32 %arg) {
; CHECK-LABEL: @propagate_drop_shl1(
; CHECK-NEXT: [[V1:%.*]] = shl nuw nsw i32 [[ARG:%.*]], 2
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = shl nsw nuw i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_shl2(i32 %arg, i32 %unknown) {
; CHECK-LABEL: @propagate_drop_shl2(
; CHECK-NEXT: [[V1:%.*]] = shl nuw nsw i32 [[ARG:%.*]], [[UNKNOWN:%.*]]
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = shl nsw nuw i32 %arg, %unknown
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_ashr1(i32 %arg) {
; CHECK-LABEL: @propagate_drop_ashr1(
; CHECK-NEXT: [[V1:%.*]] = ashr exact i32 [[ARG:%.*]], 2
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = ashr exact i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_ashr2(i32 %arg, i32 %unknown) {
; CHECK-LABEL: @propagate_drop_ashr2(
; CHECK-NEXT: [[V1:%.*]] = ashr exact i32 [[ARG:%.*]], [[UNKNOWN:%.*]]
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = ashr exact i32 %arg, %unknown
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_lshr1(i32 %arg) {
; CHECK-LABEL: @propagate_drop_lshr1(
; CHECK-NEXT: [[V1:%.*]] = lshr exact i32 [[ARG:%.*]], 2
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = lshr exact i32 %arg, 2
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}
define i32 @propagate_drop_lshr2(i32 %arg, i32 %unknown) {
; CHECK-LABEL: @propagate_drop_lshr2(
; CHECK-NEXT: [[V1:%.*]] = lshr exact i32 [[ARG:%.*]], [[UNKNOWN:%.*]]
; CHECK-NEXT: [[V1_FR:%.*]] = freeze i32 [[V1]]
; CHECK-NEXT: ret i32 [[V1_FR]]
;
%v1 = lshr exact i32 %arg, %unknown
%v1.fr = freeze i32 %v1
ret i32 %v1.fr
}