From dfa842e45a3ce1d245d9ef5a6f8b933f14b01c93 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Sat, 3 Dec 2022 19:37:57 -0500 Subject: [PATCH] ValueTracking: Add some baseline intrinsic with freeze tests --- .../InstCombine/freeze-integer-intrinsics.ll | 256 +++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll diff --git a/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll b/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll new file mode 100644 index 0000000..642a5a9 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll @@ -0,0 +1,256 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -passes=instcombine < %s | FileCheck %s + +define i32 @ctlz_true_freeze(i32 %arg) { +; CHECK-LABEL: @ctlz_true_freeze( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ctlz.i32(i32 [[ARG:%.*]], i1 true), !range [[RNG0:![0-9]+]] +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.ctlz.i32(i32 %arg, i1 true) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @ctlz_false_freeze(i32 %arg) { +; CHECK-LABEL: @ctlz_false_freeze( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.ctlz.i32(i32 [[ARG:%.*]], i1 false), !range [[RNG0]] +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.ctlz.i32(i32 %arg, i1 false) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @ctlz_true_noundef_freeze(i32 %arg) { +; CHECK-LABEL: @ctlz_true_noundef_freeze( +; CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @llvm.ctlz.i32(i32 [[ARG:%.*]], i1 true), !range [[RNG0]] +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call noundef i32 @llvm.ctlz.i32(i32 %arg, i1 true) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @cttz_true_freeze(i32 %arg) { +; CHECK-LABEL: @cttz_true_freeze( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 true), !range [[RNG0]] +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.cttz.i32(i32 %arg, i1 true) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @cttz_true_noundef_freeze(i32 %arg) { +; CHECK-LABEL: @cttz_true_noundef_freeze( +; CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 true), !range [[RNG0]] +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call noundef i32 @llvm.cttz.i32(i32 %arg, i1 true) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @freeze_cttz_true(i32 %arg) { +; CHECK-LABEL: @freeze_cttz_true( +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[ARG:%.*]] +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.cttz.i32(i32 [[FREEZE]], i1 true), !range [[RNG0]] +; CHECK-NEXT: ret i32 [[CALL]] +; + %freeze = freeze i32 %arg + %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 true) + ret i32 %call +} + +define i32 @cttz_false_freeze(i32 %arg) { +; CHECK-LABEL: @cttz_false_freeze( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.cttz.i32(i32 [[ARG:%.*]], i1 false), !range [[RNG0]] +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.cttz.i32(i32 %arg, i1 false) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @freeze_cttz_false(i32 %arg) { +; CHECK-LABEL: @freeze_cttz_false( +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[ARG:%.*]] +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.cttz.i32(i32 [[FREEZE]], i1 false), !range [[RNG0]] +; CHECK-NEXT: ret i32 [[CALL]] +; + %freeze = freeze i32 %arg + %call = call i32 @llvm.cttz.i32(i32 %freeze, i1 false) + ret i32 %call +} + +define i32 @abs_true_i32(i32 %arg) { +; CHECK-LABEL: @abs_true_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.abs.i32(i32 [[ARG:%.*]], i1 true) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.abs.i32(i32 %arg, i1 true) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @abs_false_i32(i32 %arg) { +; CHECK-LABEL: @abs_false_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.abs.i32(i32 [[ARG:%.*]], i1 false) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.abs.i32(i32 %arg, i1 false) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @noundef_abs_true_i32(i32 %arg) { +; CHECK-LABEL: @noundef_abs_true_i32( +; CHECK-NEXT: [[CALL:%.*]] = call noundef i32 @llvm.abs.i32(i32 [[ARG:%.*]], i1 true) +; CHECK-NEXT: ret i32 [[CALL]] +; + %call = call noundef i32 @llvm.abs.i32(i32 %arg, i1 true) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @bswap_i32(i32 %arg) { +; CHECK-LABEL: @bswap_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.bswap.i32(i32 [[ARG:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.bswap.i32(i32 %arg) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @bitreverse_i32(i32 %arg) { +; CHECK-LABEL: @bitreverse_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.bitreverse.i32(i32 [[ARG:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.bitreverse.i32(i32 %arg) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @fshl_i32(i32 %arg0, i32 noundef %arg1, i32 noundef %arg2) { +; CHECK-LABEL: @fshl_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fshl.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]], i32 [[ARG2:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.fshl.i32(i32 %arg0, i32 %arg1, i32 %arg2) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @fshr_i32(i32 %arg0, i32 noundef %arg1, i32 noundef %arg2) { +; CHECK-LABEL: @fshr_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fshr.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]], i32 [[ARG2:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.fshr.i32(i32 %arg0, i32 %arg1, i32 %arg2) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @smax_i32(i32 %arg0, i32 noundef %arg1) { +; CHECK-LABEL: @smax_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.smax.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.smax.i32(i32 %arg0, i32 %arg1) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @smin_i32(i32 %arg0, i32 noundef %arg1) { +; CHECK-LABEL: @smin_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.smin.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.smin.i32(i32 %arg0, i32 %arg1) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @umax_i32(i32 %arg0, i32 noundef %arg1) { +; CHECK-LABEL: @umax_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.umax.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.umax.i32(i32 %arg0, i32 %arg1) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @umin_i32(i32 %arg0, i32 noundef %arg1) { +; CHECK-LABEL: @umin_i32( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.umin.i32(i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.umin.i32(i32 %arg0, i32 %arg1) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define ptr @ptrmask_p0(ptr %arg0, i64 noundef %arg1) { +; CHECK-LABEL: @ptrmask_p0( +; CHECK-NEXT: [[CALL:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[ARG0:%.*]], i64 [[ARG1:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze ptr [[CALL]] +; CHECK-NEXT: ret ptr [[FREEZE]] +; + %call = call ptr @llvm.ptrmask.p0.i64(ptr %arg0, i64 %arg1) + %freeze = freeze ptr %call + ret ptr %freeze +} + +define i32 @fptoui_sat(float %arg) { +; CHECK-LABEL: @fptoui_sat( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fptoui.sat.i32.f32(float [[ARG:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.fptoui.sat.i32.f32(float %arg) + %freeze = freeze i32 %call + ret i32 %freeze +} + +define i32 @fptosi_sat(float %arg) { +; CHECK-LABEL: @fptosi_sat( +; CHECK-NEXT: [[CALL:%.*]] = call i32 @llvm.fptosi.sat.i32.f32(float [[ARG:%.*]]) +; CHECK-NEXT: [[FREEZE:%.*]] = freeze i32 [[CALL]] +; CHECK-NEXT: ret i32 [[FREEZE]] +; + %call = call i32 @llvm.fptosi.sat.i32.f32(float %arg) + %freeze = freeze i32 %call + ret i32 %freeze +} + +declare i32 @llvm.ctlz.i32(i32, i1 immarg) +declare i32 @llvm.cttz.i32(i32, i1 immarg) +declare i32 @llvm.abs.i32(i32, i1 immarg) +declare i32 @llvm.bswap.i32(i32) +declare i32 @llvm.bitreverse.i32(i32) +declare i32 @llvm.fshl.i32(i32, i32, i32) +declare i32 @llvm.fshr.i32(i32, i32, i32) +declare i32 @llvm.smax.i32(i32, i32) +declare i32 @llvm.smin.i32(i32, i32) +declare i32 @llvm.umax.i32(i32, i32) +declare i32 @llvm.umin.i32(i32, i32) +declare ptr @llvm.ptrmask.p0.i64(ptr, i64) +declare i32 @llvm.fptoui.sat.i32.f32(float) +declare i32 @llvm.fptosi.sat.i32.f32(float) -- 2.7.4