From a1ab959de3683890215fe1755c4be415d2df7fc8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 2 May 2002 20:41:39 +0000 Subject: [PATCH] More testcases for SCCP git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2444 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Transforms/SCCP/2002-05-02-EdgeFailure.ll | 28 +++++++++++++ test/Transforms/SCCP/basictest.ll | 20 ++++++++++ test/Transforms/SCCP/sccptest.ll | 39 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 test/Transforms/SCCP/2002-05-02-EdgeFailure.ll create mode 100644 test/Transforms/SCCP/basictest.ll create mode 100644 test/Transforms/SCCP/sccptest.ll diff --git a/test/Transforms/SCCP/2002-05-02-EdgeFailure.ll b/test/Transforms/SCCP/2002-05-02-EdgeFailure.ll new file mode 100644 index 00000000000..341847bc13a --- /dev/null +++ b/test/Transforms/SCCP/2002-05-02-EdgeFailure.ll @@ -0,0 +1,28 @@ +; edgefailure - This function illustrates how SCCP is not doing it's job. This +; function should be optimized almost completely away: the loop should be +; analyzed to detect that the body executes exactly once, and thus the branch +; can be eliminated and code becomes trivially dead. This is distilled from a +; real benchmark (mst from Olden benchmark, MakeGraph function). When SCCP is +; fixed, this should be eliminated by a single SCCP application. +; +; RUN: if as < %s | opt -sccp | dis | grep loop +; RUN: then exit 1 +; RUN: else exit 0 +; RUN: fi + +int *"test"() +begin +bb1: + %A = malloc int + br label %bb2 +bb2: + %i = phi int [ %i2, %bb2 ], [ 0, %bb1 ] ;; Always 0 + %i2 = add int %i, 1 ;; Always 1 + store int %i, int *%A + %loop = setle int %i2, 0 ;; Always false + br bool %loop, label %bb2, label %bb3 + +bb3: + ret int * %A +end + diff --git a/test/Transforms/SCCP/basictest.ll b/test/Transforms/SCCP/basictest.ll new file mode 100644 index 00000000000..239f375e052 --- /dev/null +++ b/test/Transforms/SCCP/basictest.ll @@ -0,0 +1,20 @@ +; This is a basic sanity check for constant propogation. The add instruction +; should be eliminated. + +; RUN: if as < %s | opt -sccp | dis | grep add +; RUN: then exit 1 +; RUN: else exit 0 +; RUN: fi + +int "test"(bool %B) +begin + br bool %B, label %BB1, label %BB2 +BB1: + %Val = add int 0, 0 + br label %BB3 +BB2: + br label %BB3 +BB3: + %Ret = phi int [%Val, %BB1], [1, %BB2] + ret int %Ret +end diff --git a/test/Transforms/SCCP/sccptest.ll b/test/Transforms/SCCP/sccptest.ll new file mode 100644 index 00000000000..c4eff5e3425 --- /dev/null +++ b/test/Transforms/SCCP/sccptest.ll @@ -0,0 +1,39 @@ +; This is the test case taken from appel's book that illustrates a hard case +; that SCCP gets right. BB3 should be completely eliminated. +; +; RUN: if as < %s | opt -sccp -dce | dis | grep BB3 +; RUN: then exit 1 +; RUN: else exit 0 +; RUN: fi + +int "test function"(int %i0, int %j0) +begin +BB1: + br label %BB2 +BB2: + %j2 = phi int [%j4, %BB7], [1, %BB1] + %k2 = phi int [%k4, %BB7], [0, %BB1] + %kcond = setlt int %k2, 100 + br bool %kcond, label %BB3, label %BB4 + +BB3: + %jcond = setlt int %j2, 20 + br bool %jcond, label %BB5, label %BB6 + +BB4: + ret int %j2 + +BB5: + %k3 = add int %k2, 1 + br label %BB7 + +BB6: + %k5 = add int %k2, 1 + br label %BB7 + +BB7: + %j4 = phi int [1, %BB5], [%k2, %BB6] + %k4 = phi int [%k3, %BB5], [%k5, %BB6] + br label %BB2 +end +