[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