[llvm] b2a885a - [SCCP] Add initial tests for freeze.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 23 04:13:46 PDT 2022


Author: Florian Hahn
Date: 2022-04-23T12:09:29+01:00
New Revision: b2a885a290be0ff9d2524cb1ed0b7b19a0fe6a8b

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

LOG: [SCCP] Add initial tests for freeze.

Added: 
    llvm/test/Transforms/SCCP/freeze.ll

Modified: 
    llvm/test/Transforms/SCCP/ranges-sext.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/SCCP/freeze.ll b/llvm/test/Transforms/SCCP/freeze.ll
new file mode 100644
index 0000000000000..b6a2a5628e5e9
--- /dev/null
+++ b/llvm/test/Transforms/SCCP/freeze.ll
@@ -0,0 +1,137 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -passes=ipsccp -S %s | FileCheck %s
+
+declare void @use(i1)
+
+define i1 @freeze_undef_i1() {
+; CHECK-LABEL: @freeze_undef_i1(
+; CHECK-NEXT:    [[FR:%.*]] = freeze i1 undef
+; CHECK-NEXT:    ret i1 [[FR]]
+;
+  %fr = freeze i1 undef
+  ret i1 %fr
+}
+
+define ptr @freeze_undef_ptr() {
+; CHECK-LABEL: @freeze_undef_ptr(
+; CHECK-NEXT:    [[FR:%.*]] = freeze ptr undef
+; CHECK-NEXT:    ret ptr [[FR]]
+;
+  %fr = freeze ptr undef
+  ret ptr %fr
+}
+
+define float @freeze_undef_float() {
+; CHECK-LABEL: @freeze_undef_float(
+; CHECK-NEXT:    [[FR:%.*]] = freeze float undef
+; CHECK-NEXT:    ret float [[FR]]
+;
+  %fr = freeze float undef
+  ret float %fr
+}
+
+define <2 x i32> @freeze_undef_vector() {
+; CHECK-LABEL: @freeze_undef_vector(
+; CHECK-NEXT:    [[FR:%.*]] = freeze <2 x i32> undef
+; CHECK-NEXT:    ret <2 x i32> [[FR]]
+;
+  %fr = freeze <2 x i32> undef
+  ret <2 x i32> %fr
+}
+
+define i1 @propagate_range_from_and_through_freeze(i32 %x, i32 %y) {
+; CHECK-LABEL: @propagate_range_from_and_through_freeze(
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[X:%.*]], 3
+; CHECK-NEXT:    [[AND_FR:%.*]] = freeze i32 [[AND]]
+; CHECK-NEXT:    [[F_1:%.*]] = icmp eq i32 [[AND_FR]], 100
+; CHECK-NEXT:    call void @use(i1 [[F_1]])
+; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[AND_FR]], 3
+; CHECK-NEXT:    call void @use(i1 [[T_1]])
+; CHECK-NEXT:    [[F_2:%.*]] = icmp ugt i32 [[AND_FR]], 3
+; CHECK-NEXT:    call void @use(i1 [[F_2]])
+; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[AND_FR]], [[Y:%.*]]
+; CHECK-NEXT:    call void @use(i1 [[C_1]])
+; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[T_1]], [[F_1]]
+; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[F_2]]
+; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_1]]
+; CHECK-NEXT:    ret i1 [[R_3]]
+;
+  %and = and i32 %x, 3
+  %and.fr = freeze i32 %and
+  %f.1 = icmp eq i32 %and.fr, 100
+  call void @use(i1 %f.1)
+  %t.1 = icmp ule i32 %and.fr, 3
+  call void @use(i1 %t.1)
+  %f.2 = icmp ugt i32 %and.fr, 3
+  call void @use(i1 %f.2)
+  %c.1 = icmp eq i32 %and.fr, %y
+  call void @use(i1 %c.1)
+  %r.1 = xor i1 %t.1, %f.1
+  %r.2 = xor i1 %r.1, %f.2
+  %r.3 = xor i1 %r.2, %c.1
+  ret i1 %r.3
+}
+
+define i1 @range_from_phi_with_undef(i1 %c.1, i1 %c.2) {
+; CHECK-LABEL: @range_from_phi_with_undef(
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
+; CHECK:       true.1:
+; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
+; CHECK:       true.2:
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       false:
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 10, [[TRUE_1]] ], [ 20, [[TRUE_2]] ], [ undef, [[FALSE]] ]
+; CHECK-NEXT:    [[P_FR:%.*]] = freeze i32 [[P]]
+; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[P_FR]], 20
+; CHECK-NEXT:    [[T_2:%.*]] = icmp uge i32 [[P_FR]], 10
+; CHECK-NEXT:    [[RES:%.*]] = xor i1 [[T_1]], [[T_2]]
+; CHECK-NEXT:    ret i1 [[RES]]
+;
+  br i1 %c.1, label %true.1, label %false
+
+true.1:
+  br i1 %c.2, label %true.2, label %exit
+
+true.2:
+  br label %exit
+
+false:
+  br label %exit
+
+exit:
+  %p = phi i32 [ 10, %true.1 ], [ 20, %true.2], [ undef, %false ]
+  %p.fr = freeze i32 %p
+  %t.1 = icmp ule i32 %p.fr, 20
+  %t.2 = icmp uge i32 %p.fr, 10
+  %res = xor i1 %t.1, %t.2
+  ret i1 %res
+}
+
+define i32 @propagate_info_from_predicate_through_freeze(i32 %x) {
+; CHECK-LABEL: @propagate_info_from_predicate_through_freeze(
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 10
+; CHECK-NEXT:    [[X_FR:%.*]] = freeze i32 [[X]]
+; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
+; CHECK:       then:
+; CHECK-NEXT:    [[ADD_1:%.*]] = add i32 [[X_FR]], 10
+; CHECK-NEXT:    [[ADD_2:%.*]] = add i32 [[X_FR]], 1
+; CHECK-NEXT:    ret i32 [[ADD_2]]
+; CHECK:       else:
+; CHECK-NEXT:    [[ADD_3:%.*]] = add i32 [[X_FR]], 1
+; CHECK-NEXT:    ret i32 [[ADD_3]]
+;
+  %cmp = icmp eq i32 %x, 10
+  %x.fr = freeze i32 %x
+  br i1 %cmp, label %then, label %else
+
+then:
+  %add.1 = add i32 %x.fr, %x
+  %add.2 = add i32 %x.fr, 1
+  ret i32 %add.2
+
+else:
+  %add.3 = add i32 %x.fr, 1
+  ret i32 %add.3
+}

diff  --git a/llvm/test/Transforms/SCCP/ranges-sext.ll b/llvm/test/Transforms/SCCP/ranges-sext.ll
index b5b6c2c9776e7..bd924a7393015 100644
--- a/llvm/test/Transforms/SCCP/ranges-sext.ll
+++ b/llvm/test/Transforms/SCCP/ranges-sext.ll
@@ -32,6 +32,39 @@ exit:
   ret i64 %ext
 }
 
+define i64 @test1_sext_op_can_be_undef_but_frozen(i1 %c.1, i1 %c.2) {
+; CHECK-LABEL: @test1_sext_op_can_be_undef_but_frozen(
+; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
+; CHECK:       true.1:
+; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
+; CHECK:       true.2:
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       false:
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 0, [[TRUE_1]] ], [ 1, [[TRUE_2]] ], [ undef, [[FALSE]] ]
+; CHECK-NEXT:    [[P_FR:%.*]] = freeze i32 [[P]]
+; CHECK-NEXT:    [[EXT:%.*]] = sext i32 [[P_FR]] to i64
+; CHECK-NEXT:    ret i64 [[EXT]]
+;
+  br i1 %c.1, label %true.1, label %false
+
+true.1:
+  br i1 %c.2, label %true.2, label %exit
+
+true.2:
+  br label %exit
+
+false:
+  br label %exit
+
+exit:
+  %p = phi i32 [ 0, %true.1 ], [ 1, %true.2], [ undef, %false ]
+  %p.fr = freeze i32 %p
+  %ext = sext i32 %p.fr to i64
+  ret i64 %ext
+}
+
 define i64 @test2(i32 %x) {
 ; CHECK-LABEL: @test2(
 ; CHECK-NEXT:    [[P:%.*]] = and i32 [[X:%.*]], 15


        


More information about the llvm-commits mailing list