ValueTracking: Add some baseline intrinsic with freeze tests
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Sun, 4 Dec 2022 00:37:57 +0000 (19:37 -0500)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Mon, 5 Dec 2022 14:40:58 +0000 (09:40 -0500)
llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll [new file with mode: 0644]

diff --git a/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll b/llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll
new file mode 100644 (file)
index 0000000..642a5a9
--- /dev/null
@@ -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)