From 357b8d7ddba0b4258063cda132ad03473f28b7e1 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Tue, 12 Oct 2021 12:01:36 -0700 Subject: [PATCH] [tests] Add coverage for cases we can drop flags to propagate freeze without cost --- llvm/test/Transforms/InstCombine/freeze.ll | 126 ++++++++++++++++++++++++++++- 1 file changed, 124 insertions(+), 2 deletions(-) diff --git a/llvm/test/Transforms/InstCombine/freeze.ll b/llvm/test/Transforms/InstCombine/freeze.ll index ac30036..bb2f15f 100644 --- a/llvm/test/Transforms/InstCombine/freeze.ll +++ b/llvm/test/Transforms/InstCombine/freeze.ll @@ -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 +} + + -- 2.7.4