From dce4a407a24b04eebc6a376f8e62b41aaa7b071f Mon Sep 17 00:00:00 2001 From: Stephen Hines Date: Thu, 29 May 2014 02:49:00 -0700 Subject: Update LLVM for 3.5 rebase (r209712). Change-Id: I149556c940fb7dc92d075273c87ff584f400941f --- .../X86/constant-hoisting-shift-immediate.ll | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 test/CodeGen/X86/constant-hoisting-shift-immediate.ll (limited to 'test/CodeGen/X86/constant-hoisting-shift-immediate.ll') 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 +} -- cgit v1.1