From 578ccf81e5b94965e3ce8b4eadb6834e39f5f41d Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Tue, 21 Apr 2009 20:18:36 +0000 Subject: When turning (ashr(shl(x, n), n)) into sext(trunc(x)), the width of the type to truncate to should be the number of bits of the value that are preserved, not the number that are clobbered with sign-extension. This fixes regressions in ldecod. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69704 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Analysis/ScalarEvolution/sext-inreg.ll | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/Analysis/ScalarEvolution/sext-inreg.ll (limited to 'test/Analysis') diff --git a/test/Analysis/ScalarEvolution/sext-inreg.ll b/test/Analysis/ScalarEvolution/sext-inreg.ll new file mode 100644 index 0000000..c482fe6 --- /dev/null +++ b/test/Analysis/ScalarEvolution/sext-inreg.ll @@ -0,0 +1,29 @@ +; RUN: llvm-as < %s | opt -analyze -scalar-evolution -disable-output \ +; RUN: | grep {signextend \{0,+,199\} to i64} | count 2 + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128" +target triple = "i386-apple-darwin9.6" + +define i64 @foo(i64* nocapture %x, i64 %n) nounwind { +entry: + %t0 = icmp sgt i64 %n, 0 ; [#uses=1] + br i1 %t0, label %bb, label %return + +bb: ; preds = %bb, %entry + %i.01 = phi i64 [ 0, %entry ], [ %indvar.next, %bb ] ; [#uses=2] + %t1 = shl i64 %i.01, 7 ; [#uses=1] + %t2 = ashr i64 %t1, 7 ; [#uses=1] + %s1 = shl i64 %i.01, 5 ; [#uses=1] + %s2 = ashr i64 %s1, 5 ; [#uses=1] + %t3 = getelementptr i64* %x, i64 %i.01 ; [#uses=1] + store i64 0, i64* %t3, align 1 + %indvar.next = add i64 %i.01, 199 ; [#uses=2] + %exitcond = icmp eq i64 %indvar.next, %n ; [#uses=1] + br i1 %exitcond, label %return, label %bb + +return: ; preds = %bb, %entry + %p = phi i64 [ 0, %entry ], [ %t2, %bb ] + %q = phi i64 [ 0, %entry ], [ %s2, %bb ] + %v = xor i64 %p, %q + ret i64 %v +} -- cgit v1.1