diff options
author | Stephen Hines <srhines@google.com> | 2014-05-29 02:49:00 -0700 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2014-05-29 02:49:00 -0700 |
commit | dce4a407a24b04eebc6a376f8e62b41aaa7b071f (patch) | |
tree | dcebc53f2b182f145a2e659393bf9a0472cedf23 /test/CodeGen/X86/constant-hoisting-shift-immediate.ll | |
parent | 220b921aed042f9e520c26cffd8282a94c66c3d5 (diff) | |
download | external_llvm-dce4a407a24b04eebc6a376f8e62b41aaa7b071f.zip external_llvm-dce4a407a24b04eebc6a376f8e62b41aaa7b071f.tar.gz external_llvm-dce4a407a24b04eebc6a376f8e62b41aaa7b071f.tar.bz2 |
Update LLVM for 3.5 rebase (r209712).
Change-Id: I149556c940fb7dc92d075273c87ff584f400941f
Diffstat (limited to 'test/CodeGen/X86/constant-hoisting-shift-immediate.ll')
-rw-r--r-- | test/CodeGen/X86/constant-hoisting-shift-immediate.ll | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/test/CodeGen/X86/constant-hoisting-shift-immediate.ll b/test/CodeGen/X86/constant-hoisting-shift-immediate.ll new file mode 100644 index 0000000..883be35 --- /dev/null +++ b/test/CodeGen/X86/constant-hoisting-shift-immediate.ll @@ -0,0 +1,25 @@ +; RUN: llc < %s -O3 -march=x86-64 |FileCheck %s +define i64 @foo(i1 %z, i192* %p, i192* %q) +{ +; If const 128 is hoisted to a variable, then in basic block L_val2 we would +; have %lshr2 = lshr i192 %data2, %const, and the definition of %const would +; be in another basic block. As a result, a very inefficient code might be +; produced. Here we check that this doesn't occur. +entry: + %data1 = load i192* %p, align 8 + %lshr1 = lshr i192 %data1, 128 + %val1 = trunc i192 %lshr1 to i64 + br i1 %z, label %End, label %L_val2 + +; CHECK: movq 16(%rdx), %rax +; CHECK-NEXT: retq +L_val2: + %data2 = load i192* %q, align 8 + %lshr2 = lshr i192 %data2, 128 + %val2 = trunc i192 %lshr2 to i64 + br label %End + +End: + %p1 = phi i64 [%val1,%entry], [%val2,%L_val2] + ret i64 %p1 +} |