Index: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp =================================================================== --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp @@ -847,7 +847,7 @@ // If the last (struct) indices are constants and are equal, the other indices // might be also be dynamically equal, so the GEPs can alias. - if (C1 && C2 && C1 == C2) + if (C1 && C2 && C1->getSExtValue() == C2->getSExtValue()) return MayAlias; // Find the last-indexed type of the GEP, i.e., the type you'd get if Index: llvm/trunk/test/Analysis/BasicAA/struct-geps.ll =================================================================== --- llvm/trunk/test/Analysis/BasicAA/struct-geps.ll +++ llvm/trunk/test/Analysis/BasicAA/struct-geps.ll @@ -162,3 +162,12 @@ %y = getelementptr %struct2, %struct2* %st, i32 0, i32 0, i32 1, i32 1 ret void } + +; PR27418 - Treat GEP indices with the same value but different types the same +; CHECK-LABEL: test_different_index_types +; CHECK: MustAlias: i16* %tmp1, i16* %tmp2 +define void @test_different_index_types([2 x i16]* %arr) { + %tmp1 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i32 1 + %tmp2 = getelementptr [2 x i16], [2 x i16]* %arr, i16 0, i16 1 + ret void +}