| ; RUN: llc < %s -O3 -mtriple=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, 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, 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 | |
| } |