diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-08-27 20:08:37 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-08-27 20:08:37 +0000 |
commit | 22ccfc44845f29e850c52d4b3850f9ac8a82922c (patch) | |
tree | d220fc6fb4f8b2a66e5fd077e1915bd675055c7d /llvm/test/Transforms/InstCombine/getelementptr.ll | |
parent | 11ca2971e88f37dc1b40f00542cb6228e255fee4 (diff) | |
download | bcm5719-llvm-22ccfc44845f29e850c52d4b3850f9ac8a82922c.tar.gz bcm5719-llvm-22ccfc44845f29e850c52d4b3850f9ac8a82922c.zip |
InstCombine: Combine gep X, (Y-X) to Y
We try to perform this transform in InstSimplify but we aren't always
able to. Sometimes, we need to insert a bitcast if X and Y don't have
the same time.
llvm-svn: 216598
Diffstat (limited to 'llvm/test/Transforms/InstCombine/getelementptr.ll')
-rw-r--r-- | llvm/test/Transforms/InstCombine/getelementptr.ll | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/getelementptr.ll b/llvm/test/Transforms/InstCombine/getelementptr.ll index 71546ae3328..684d9447129 100644 --- a/llvm/test/Transforms/InstCombine/getelementptr.ll +++ b/llvm/test/Transforms/InstCombine/getelementptr.ll @@ -858,6 +858,19 @@ define %struct.C* @test44(%struct.C* %c1, %struct.C* %c2) { ; CHECK-NEXT: ret %struct.C* [[INTTOPTR]] } +define %struct.C* @test45(%struct.C* %c1, %struct.C** %c2) { + %ptrtoint1 = ptrtoint %struct.C* %c1 to i64 + %ptrtoint2 = ptrtoint %struct.C** %c2 to i64 + %sub = sub i64 %ptrtoint2, %ptrtoint1 ; C2 - C1 + %shr = sdiv i64 %sub, 7 + %gep = getelementptr inbounds %struct.C* %c1, i64 %shr ; C1 + (C2 - C1) + ret %struct.C* %gep + +; CHECK-LABEL: @test45( +; CHECK-NEXT: [[BITCAST:%.*]] = bitcast %struct.C** %c2 to %struct.C* +; CHECK-NEXT: ret %struct.C* [[BITCAST]] +} + define i32 addrspace(1)* @ascast_0_gep(i32* %p) nounwind { ; CHECK-LABEL: @ascast_0_gep( ; CHECK-NOT: getelementptr |