[llvm] 0062441 - [SCCP] Add a few more tests for conditional propagation, XOR.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Sun Mar 22 14:43:59 PDT 2020


Author: Florian Hahn
Date: 2020-03-22T21:43:33Z
New Revision: 006244152d6c7dd6a390ff89b236cc7801834b46

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

LOG: [SCCP] Add a few more tests for conditional propagation,XOR.

Added: 
    llvm/test/Transforms/SCCP/apint-xor.ll
    llvm/test/Transforms/SCCP/conditions-iter-order.ll
    llvm/test/Transforms/SCCP/conditions-ranges.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/SCCP/apint-xor.ll b/llvm/test/Transforms/SCCP/apint-xor.ll
new file mode 100644
index 000000000000..26d31d77ac71
--- /dev/null
+++ b/llvm/test/Transforms/SCCP/apint-xor.ll
@@ -0,0 +1,39 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -sccp -S | FileCheck %s
+
+; Test some XOR simplifications / range propagation.
+define void at xor1(i1 %cmp) {
+; CHECK-LABEL: @xor1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 [[CMP:%.*]], label [[IF_TRUE:%.*]], label [[END:%.*]]
+; CHECK:       if.true:
+; CHECK-NEXT:    br label [[END]]
+; CHECK:       end:
+; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    call void @use(i1 false)
+; CHECK-NEXT:    call void @use(i1 false)
+; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    ret void
+;
+entry:
+  br i1 %cmp, label %if.true, label %end
+
+if.true:
+  br label %end
+
+end:
+  %p = phi i32 [ 11, %entry ], [ 11, %if.true]
+  %xor.1 = xor i32 %p, %p
+  %c.1 = icmp eq i32 %xor.1, 0
+  call void @use(i1 %c.1)
+  %c.2 = icmp eq i32 %xor.1, 10
+  call void @use(i1 %c.2)
+  %xor.2 = xor i32 %p, 1
+  %c.3 = icmp eq i32 %xor.2, 11
+  call void @use(i1 %c.3)
+  %c.4 = icmp eq i32 %xor.2, 10
+  call void @use(i1 %c.4)
+  ret void
+}
+
+declare void @use(i1)

diff  --git a/llvm/test/Transforms/SCCP/conditions-iter-order.ll b/llvm/test/Transforms/SCCP/conditions-iter-order.ll
new file mode 100644
index 000000000000..5e7e4f31b4c2
--- /dev/null
+++ b/llvm/test/Transforms/SCCP/conditions-iter-order.ll
@@ -0,0 +1,79 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -ipsccp -S %s | FileCheck %s
+
+declare noalias i8* @malloc(i64)
+
+; Make sure we can eliminate `%tmp17 = icmp ult i32 %tmp10, 3`.
+
+declare void @use(i1)
+
+define internal i32* @spam(i32* %arg) {
+; CHECK-LABEL: @spam(
+; CHECK-NEXT:  bb:
+; CHECK-NEXT:    [[TMP:%.*]] = call i8* @malloc(i64 10368)
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[TMP]] to i32*
+; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i32, i32* [[ARG:%.*]], i32 0
+; CHECK-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP4]], align 8
+; CHECK-NEXT:    [[TMP6:%.*]] = add i32 [[TMP5]], 1
+; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i32 1
+; CHECK-NEXT:    [[TMP10:%.*]] = icmp ne i32* [[TMP7]], null
+; CHECK-NEXT:    br i1 [[TMP10]], label [[BB17:%.*]], label [[BB13:%.*]]
+; CHECK:       bb13:
+; CHECK-NEXT:    [[TMP14:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i32 2
+; CHECK-NEXT:    [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 8
+; CHECK-NEXT:    [[TMP16:%.*]] = add i32 [[TMP15]], 1
+; CHECK-NEXT:    br label [[BB30:%.*]]
+; CHECK:       bb17:
+; CHECK-NEXT:    [[TMP18:%.*]] = icmp eq i32 [[TMP6]], [[TMP5]]
+; CHECK-NEXT:    [[TMP19:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i32 3
+; CHECK-NEXT:    [[TMP20:%.*]] = load i32, i32* [[TMP19]], align 8
+; CHECK-NEXT:    br i1 [[TMP18]], label [[BB30]], label [[BB13]]
+; CHECK:       bb30:
+; CHECK-NEXT:    ret i32* [[TMP1]]
+;
+bb:
+  %tmp = call i8* @malloc(i64 10368)
+  %tmp1 = bitcast i8* %tmp to i32*
+  %tmp4 = getelementptr inbounds i32, i32* %arg, i32 0
+  %tmp5 = load i32, i32* %tmp4, align 8
+  %tmp6 = add i32 %tmp5, 1
+  %tmp7 = getelementptr inbounds i32, i32* %arg, i32 1
+  %tmp10 = icmp ne i32* %tmp7, null
+  br i1 %tmp10, label %bb17, label %bb13
+
+bb13:
+  %tmp14 = getelementptr inbounds i32, i32* %arg, i32 2
+  %tmp15 = load i32, i32* %tmp14, align 8
+  %tmp16 = add i32 %tmp15, 1
+  br label %bb30
+
+bb17:
+  %tmp18 = icmp eq i32 %tmp6, %tmp5
+  %tmp19 = getelementptr inbounds i32, i32* %arg, i32 3
+  %tmp20 = load i32, i32* %tmp19, align 8
+  br i1 %tmp18, label %bb30, label %bb13
+
+bb30:
+  ret i32* %tmp1
+}
+
+define void @spam.1(i32* %arg) {
+bb:
+  %tmp = alloca i8*, align 8
+  %tmp4 = call i32* @spam(i32* %arg)
+  br label %bb6
+
+bb6:                                              ; preds = %bb5
+  %tmp7 = getelementptr inbounds i32, i32* %tmp4, i32 1
+  %tmp10 = load i32, i32* %tmp7, align 8
+  %tmp11 = icmp ne i32 %tmp10, 0
+  br i1 %tmp11, label %bb6, label %bb15
+
+bb15:                                             ; preds = %bb12
+  %tmp17 = icmp ult i32 %tmp10, 3
+  call void @use(i1 %tmp17)
+  br i1 %tmp17, label %bb6, label %bb24
+
+bb24:
+  ret void
+}

diff  --git a/llvm/test/Transforms/SCCP/conditions-ranges.ll b/llvm/test/Transforms/SCCP/conditions-ranges.ll
new file mode 100644
index 000000000000..f8a93f93ec69
--- /dev/null
+++ b/llvm/test/Transforms/SCCP/conditions-ranges.ll
@@ -0,0 +1,287 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -ipsccp -S | FileCheck %s
+
+declare void @use(i1)
+
+define void @f1(i32 %a, i32 %b) {
+; CHECK-LABEL: @f1(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[A_255:%.*]] = and i32 [[A:%.*]], 255
+; CHECK-NEXT:    [[A_2:%.*]] = add i32 [[A_255]], 20
+; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
+; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       true:
+; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i32 [[B]], 0
+; CHECK-NEXT:    call void @use(i1 [[C_2]])
+; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[C_3]])
+; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[C_4]])
+; CHECK-NEXT:    ret void
+; CHECK:       false:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %a.255 = and i32 %a, 255
+  %a.2 = add i32 %a.255, 20
+  %c.1 = icmp ugt i32 %b, %a.2
+  br i1 %c.1, label %true, label %false
+
+true:
+  %c.2 = icmp eq i32 %b, 0
+  call void @use(i1 %c.2)
+  %c.3 = icmp eq i32 %b, 20
+  call void @use(i1 %c.3)
+  %c.4 = icmp eq i32 %b, 21
+  call void @use(i1 %c.4)
+  ret void
+
+false:
+  ret void
+}
+
+
+define void @f2(i8* %a) {
+; CHECK-LABEL: @f2(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i8* [[A:%.*]], null
+; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       true:
+; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    ret void
+; CHECK:       false:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %c.1 = icmp eq i8* %a, null
+  br i1 %c.1, label %true, label %false
+
+true:
+  %c.2 = icmp eq i8*%a, null
+  call void @use(i1 %c.2)
+  ret void
+
+false:
+  ret void
+}
+
+define i8* @f3(i8* %a, i8* %b, i1 %c) {
+; CHECK-LABEL: @f3(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i8* [[A:%.*]], null
+; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       true:
+; CHECK-NEXT:    br i1 [[C:%.*]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
+; CHECK:       true.2:
+; CHECK-NEXT:    br label [[EXIT_2:%.*]]
+; CHECK:       false.2:
+; CHECK-NEXT:    br label [[EXIT_2]]
+; CHECK:       exit.2:
+; CHECK-NEXT:    [[P:%.*]] = phi i8* [ null, [[TRUE_2]] ], [ [[B:%.*]], [[FALSE_2]] ]
+; CHECK-NEXT:    ret i8* [[P]]
+; CHECK:       false:
+; CHECK-NEXT:    ret i8* null
+;
+entry:
+  %c.1 = icmp eq i8* %a, null
+  br i1 %c.1, label %true, label %false
+
+true:
+  br i1 %c, label %true.2, label %false.2
+
+true.2:
+  br label %exit.2
+
+false.2:
+  br label %exit.2
+
+exit.2:
+  %p = phi i8* [ %a, %true.2 ], [ %b, %false.2 ]
+  ret i8* %p
+
+false:
+  ret i8* null
+}
+
+
+define i32 @f5(i64 %sz) {
+; CHECK-LABEL: @f5(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
+; CHECK:       cond.true:
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 4088, [[SZ]]
+; CHECK-NEXT:    br label [[COND_END]]
+; CHECK:       cond.end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[COND]] to i32
+; CHECK-NEXT:    ret i32 [[CONV]]
+;
+entry:
+  %cmp = icmp ugt i64 4088, %sz
+  br i1 %cmp, label %cond.true, label %cond.end
+
+cond.true:                                        ; preds = %entry
+  %div = udiv i64 4088, %sz
+  br label %cond.end
+
+cond.end:                                         ; preds = %entry, %cond.true
+  %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
+  %conv = trunc i64 %cond to i32
+  ret i32 %conv
+}
+
+define void @f6(i32 %b) {
+; CHECK-LABEL: @f6(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[B:%.*]], 20
+; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       true:
+; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    ret void
+; CHECK:       false:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %a = add i32 10, 10
+  %c.1 = icmp ugt i32 %b, %a
+  br i1 %c.1, label %true, label %false
+
+true:
+  %c.2 = icmp eq i32 %a, 20
+  call void @use(i1 %c.2)
+  ret void
+
+false:
+  ret void
+}
+
+
+define void @loop.1() {
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.cond.cleanup13, %if.then
+  %i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]
+  %cmp9 = icmp sle i32 %i.0, 3
+  br i1 %cmp9, label %for.body, label %for.cond.cleanup
+
+for.cond.cleanup:                                 ; preds = %for.cond
+  ret void
+
+for.body:                                         ; preds = %for.cond
+  br label %for.cond11
+
+for.cond11:                                       ; preds = %arrayctor.cont21, %for.body
+   br label %for.cond.cleanup13
+
+for.cond.cleanup13:                               ; preds = %for.cond11
+  %inc27 = add nsw i32 %i.0, 1
+  br label %for.cond
+}
+
+
+define void @loop() {
+; CHECK-LABEL: @loop(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[FOR_COND:%.*]]
+; CHECK:       for.cond:
+; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC27:%.*]], [[FOR_COND_CLEANUP13:%.*]] ]
+; CHECK-NEXT:    [[CMP9:%.*]] = icmp sle i32 [[I_0]], 3
+; CHECK-NEXT:    br i1 [[CMP9]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
+; CHECK:       for.cond.cleanup:
+; CHECK-NEXT:    ret void
+; CHECK:       for.body:
+; CHECK-NEXT:    br label [[FOR_COND11:%.*]]
+; CHECK:       for.cond11:
+; CHECK-NEXT:    [[J_0:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[INC:%.*]], [[FOR_BODY14:%.*]] ]
+; CHECK-NEXT:    [[CMP12:%.*]] = icmp slt i32 [[J_0]], 2
+; CHECK-NEXT:    br i1 [[CMP12]], label [[FOR_BODY14]], label [[FOR_COND_CLEANUP13]]
+; CHECK:       for.cond.cleanup13:
+; CHECK-NEXT:    [[INC27]] = add nsw i32 [[I_0]], 1
+; CHECK-NEXT:    br label [[FOR_COND]]
+; CHECK:       for.body14:
+; CHECK-NEXT:    [[INC]] = add nsw i32 [[J_0]], 1
+; CHECK-NEXT:    br label [[FOR_COND11]]
+;
+entry:
+  br label %for.cond
+
+for.cond:                                         ; preds = %for.cond.cleanup13, %if.then
+  %i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]
+  %cmp9 = icmp sle i32 %i.0, 3
+  br i1 %cmp9, label %for.body, label %for.cond.cleanup
+
+for.cond.cleanup:                                 ; preds = %for.cond
+  ret void
+
+for.body:                                         ; preds = %for.cond
+  br label %for.cond11
+
+for.cond11:                                       ; preds = %arrayctor.cont21, %for.body
+  %j.0 = phi i32 [ 0, %for.body ], [ %inc, %for.body14 ]
+  %cmp12 = icmp slt i32 %j.0, 2
+  br i1 %cmp12, label %for.body14, label %for.cond.cleanup13
+
+for.cond.cleanup13:                               ; preds = %for.cond11
+  %inc27 = add nsw i32 %i.0, 1
+  br label %for.cond
+
+for.body14:
+  %inc = add nsw i32 %j.0, 1
+  br label %for.cond11
+}
+
+define i32 @foo(i64 %sz) {
+; CHECK-LABEL: @foo(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
+; CHECK:       cond.true:
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 4088, [[SZ]]
+; CHECK-NEXT:    br label [[COND_END]]
+; CHECK:       cond.end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[COND]] to i32
+; CHECK-NEXT:    ret i32 [[CONV]]
+;
+entry:
+  %cmp = icmp ugt i64 4088, %sz
+  br i1 %cmp, label %cond.true, label %cond.end
+
+cond.true:                                        ; preds = %entry
+  %div = udiv i64 4088, %sz
+  br label %cond.end
+
+cond.end:                                         ; preds = %entry, %cond.true
+  %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
+  %conv = trunc i64 %cond to i32
+  ret i32 %conv
+}
+
+define i32 @bar(i64 %sz) {
+; CHECK-LABEL: @bar(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[SZ:%.*]], 4088
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
+; CHECK:       cond.true:
+; CHECK-NEXT:    [[DIV:%.*]] = udiv i64 4088, [[SZ]]
+; CHECK-NEXT:    br label [[COND_END]]
+; CHECK:       cond.end:
+; CHECK-NEXT:    [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[COND]] to i32
+; CHECK-NEXT:    ret i32 [[CONV]]
+;
+entry:
+  %cmp = icmp ugt i64 %sz, 4088
+  br i1 %cmp, label %cond.true, label %cond.end
+
+cond.true:                                        ; preds = %entry
+  %div = udiv i64 4088, %sz
+  br label %cond.end
+
+cond.end:                                         ; preds = %entry, %cond.true
+  %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]
+  %conv = trunc i64 %cond to i32
+  ret i32 %conv
+}


        


More information about the llvm-commits mailing list