diff options
author | Dan Gohman <gohman@apple.com> | 2009-06-13 16:25:49 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-06-13 16:25:49 +0000 |
commit | 4d8414f42033a5e744e8e60d2ca188b424c76168 (patch) | |
tree | 412ece01df0e34791df86cc1320d8e8a7b0f9653 /test/Transforms/IndVarSimplify/masked-iv.ll | |
parent | 2ce84c8d4784dfd24458a63db8d531917d2f8ba5 (diff) | |
download | external_llvm-4d8414f42033a5e744e8e60d2ca188b424c76168.zip external_llvm-4d8414f42033a5e744e8e60d2ca188b424c76168.tar.gz external_llvm-4d8414f42033a5e744e8e60d2ca188b424c76168.tar.bz2 |
Teach SCEVExpander's visitAddRecExpr to reuse an existing canonical
induction variable when the addrec to be expanded does not require
a wider type. This eliminates the need for IndVarSimplify to
micro-manage SCEV expansions, because SCEVExpander now
automatically expands them in the form that IndVarSimplify considers
to be canonical. (LSR still micro-manages its SCEV expansions,
because it's optimizing for the target, rather than for
other optimizations.)
Also, this uses the new getAnyExtendExpr, which has more clever
expression simplification logic than the IndVarSimplify code it
replaces, and this cleans up some ugly expansions in code such as
the included masked-iv.ll testcase.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73294 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/IndVarSimplify/masked-iv.ll')
-rw-r--r-- | test/Transforms/IndVarSimplify/masked-iv.ll | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/test/Transforms/IndVarSimplify/masked-iv.ll b/test/Transforms/IndVarSimplify/masked-iv.ll new file mode 100644 index 0000000..c7583c9 --- /dev/null +++ b/test/Transforms/IndVarSimplify/masked-iv.ll @@ -0,0 +1,24 @@ +; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep trunc | count 1 + +; Indvars should do the IV arithmetic in the canonical IV type (i64), +; and only use one truncation. + +define void @foo(i64* %A, i64* %B, i64 %n, i64 %a, i64 %s) nounwind { +entry: + %t0 = icmp sgt i64 %n, 0 ; <i1> [#uses=1] + br i1 %t0, label %bb.preheader, label %return + +bb.preheader: ; preds = %entry + br label %bb + +bb: ; preds = %bb, %bb.preheader + %i.01 = phi i64 [ %t6, %bb ], [ %a, %bb.preheader ] ; <i64> [#uses=3] + %t1 = and i64 %i.01, 255 ; <i64> [#uses=1] + %t2 = getelementptr i64* %A, i64 %t1 ; <i64*> [#uses=1] + store i64 %i.01, i64* %t2, align 8 + %t6 = add i64 %i.01, %s ; <i64> [#uses=1] + br label %bb + +return: ; preds = %entry + ret void +} |