[llvm] dfa842e - ValueTracking: Add some baseline intrinsic with freeze tests

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 5 06:41:25 PST 2022


Author: Matt Arsenault
Date: 2022-12-05T09:40:58-05:00
New Revision: dfa842e45a3ce1d245d9ef5a6f8b933f14b01c93

URL: https://github.com/llvm/llvm-project/commit/dfa842e45a3ce1d245d9ef5a6f8b933f14b01c93
DIFF: https://github.com/llvm/llvm-project/commit/dfa842e45a3ce1d245d9ef5a6f8b933f14b01c93.diff

LOG: ValueTracking: Add some baseline intrinsic with freeze tests

Added: 
    llvm/test/Transforms/InstCombine/freeze-integer-intrinsics.ll

Modified: 
    

Removed: 
    


################################################################################
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 0000000000000..642a5a92d5440
--- /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)


        


More information about the llvm-commits mailing list