<div dir="ltr"><div><div>I've made some progress at defining the problem, at least. The "real fix" should pass the two tests below - and my WIP patch is something like:<br><br>diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp<br>index 9aba0d3..ef018c0 100644<br>--- a/lib/Analysis/BasicAliasAnalysis.cpp<br>+++ b/lib/Analysis/BasicAliasAnalysis.cpp<br>@@ -263,9 +267,12 @@ static Value *GetLinearExpression(Value *V, APInt &Scale, APInt &Offset,<br>                                         DL, Depth+1, AT, DT);<br>     Scale = Scale.zext(OldWidth);<br> <br>-    // We have to sign-extend even if Extension == EK_ZeroExt as we can't<br>-    // decompose a sign extension (i.e. zext(x - 1) != zext(x) - zext(-1)).<br>-    Offset = Offset.sext(OldWidth);<br>+    // We have to be careful if Extension == EK_ZeroExt as we can't<br>+    // decompose a sign extension, e.g. zext(x - 1) != zext(x) - zext(-1).<br>+    // This isn't true in all cases though, as zext(-1) != sext(-1).<br>+    Offset = isa<SExtInst>(V)<br>+      ? Offset.sext(OldWidth)<br>+      : Offset.zext(OldWidth);<br> <br>     return Result;<br>   }<br><br></div>I'll keep working on this. Thanks -<br><br></div>Nick<br><div><div><br>; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s<br>target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"<br>target triple = "thumbv7--linux-gnueabi"<br><br>%struct.spec_fd_t = type { i32, i32, i32, i32, i32 }<br>@spec_fd = common global [280 x %struct.spec_fd_t] zeroinitializer, align 4<br><br>; CHECK-LABEL: test_path_dependent<br>; CHECK: MustAlias: i8* %a, i8* %b<br>define void @test_path_dependent(i32 %p, i8* %mem) {<br>  %p.64 = zext i32 %p to i64<br>  %a = getelementptr inbounds i8* %mem, i64 %p.64<br>  %p.minus1 = add nsw nuw i32 %p, -1<br>  %p.minus1.64 = zext i32 %p.minus1 to i64<br>  %p.64.again = add nsw nuw i64 %p.minus1.64, 1<br>  %b = getelementptr inbounds i8* %mem, i64 %p.64.again<br>  ret void<br>}<br><br>; CHECK-LABEL: uncompressStream<br>; CHECK: MustAlias:  i32* %offset.2.a, i32* %offset.2.b<br>; CHECK: PartialAlias:  [280 x %struct.spec_fd_t]* @spec_fd, i32* %offset.2.b<br>; CHECK: NoAlias: [280 x %struct.spec_fd_t]* @spec_fd, i32* %offset.2.c<br>; CHECK: NoAlias:  i32* %offset.2.b, i32* %offset.2.c<br>define void @uncompressStream() {<br>  %offset.2.a = getelementptr inbounds [280 x %struct.spec_fd_t]* @spec_fd, i32 0, i32 255, i32 2<br>  %literal.255 = zext i8 255 to i32<br>  %offset.2.b = getelementptr inbounds [280 x %struct.spec_fd_t]* @spec_fd, i32 0, i32 %literal.255, i32 2<br>  %literal.minus1 = sext i8 255 to i32<br>  %offset.2.c = getelementptr inbounds [280 x %struct.spec_fd_t]* @spec_fd, i32 0, i32 %literal.minus1, i32 2<br>  ret void<br>}<br><br></div></div></div>