I finally managed to reproduce the issue:
define void @bad(i32* %A, i32 %x) {
entry:
%do = icmp slt i32 0, %x
br i1 %do, label %loop.prehead, label %exit
loop.prehead: ; preds = %entry
br label %loop.body
loop.body: ; preds = %loop.body, %loop.prehead
%i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]
%i.next = add nsw i32 %i, 1
%i.96 = add nsw i32 %i, 96
%store.addr = getelementptr i32, i32* %A, i32 %i.next
store i32 %i, i32* %store.addr, align 4
%cmp = icmp slt i32 %i.next, %x
br i1 %cmp, label %loop.body, label %loop.exit
loop.exit: ; preds = %loop.body
br label %exit
exit: ; preds = %loop.exit, %entry
ret void
}
; Printing analysis ‘Scalar Evolution Analysis’ for function ‘bad’:
; Classifying expressions for: @bad
; %i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]
; → {0,+,1}<%loop.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %x) LoopDispositions: { %loop.body: Computable }
; %i.next = add nsw i32 %i, 1
; → {1,+,1}<%loop.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %x LoopDispositions: { %loop.body: Computable }
; %i.96 = add nsw i32 %i, 96
; → {96,+,1}<%loop.body> U: [96,-2147483553) S: [96,-2147483553) Exits: (95 + %x) LoopDispositions: { %loop.body: Computable }
; %store.addr = getelementptr i32, i32* %A, i32 %i.next
; → {(8 + %A),+,8}<%loop.body> U: full-set S: full-set Exits: (8 + (8 * (zext i32 (-1 + %x) to i64)) + %A) LoopDispositions: { %loop.body: Computable }
; Determining loop execution counts for: @bad
; Loop %loop.body: backedge-taken count is (-1 + %x)
; Loop %loop.body: max backedge-taken count is 2147483646
; Loop %loop.body: Predicated backedge-taken count is (-1 + %x)
; Predicates:
;
; Loop %loop.body: Trip multiple is 1
define void @good(i32* %A, i32 %x) {
entry:
%do = icmp slt i32 0, %x
br i1 %do, label %loop.prehead, label %exit
loop.prehead: ; preds = %entry
br label %loop.body
loop.body: ; preds = %loop.body, %loop.prehead
%i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]
%i.next = add nsw i32 %i, 1
%i.96 = add nsw i32 %i, 96
%store.addr = getelementptr i32, i32* %A, i32 %i.96
store i32 %i, i32* %store.addr, align 4
%cmp = icmp slt i32 %i.next, %x
br i1 %cmp, label %loop.body, label %loop.exit
loop.exit: ; preds = %loop.body
br label %exit
exit: ; preds = %loop.exit, %entry
ret void
}
; Printing analysis ‘Scalar Evolution Analysis’ for function ‘good’:
; Classifying expressions for: @good
; %i = phi i32 [ 0, %loop.prehead ], [ %i.next, %loop.body ]
; → {0,+,1}<%loop.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %x) LoopDispositions: { %loop.body: Computable }
; %i.next = add nsw i32 %i, 1
; → {1,+,1}<%loop.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %x LoopDispositions: { %loop.body: Computable }
; %i.96 = add nsw i32 %i, 96
; → {96,+,1}<%loop.body> U: [96,-2147483648) S: [96,-2147483648) Exits: (95 + %x) LoopDispositions: { %loop.body: Computable }
; %store.addr = getelementptr i32, i32* %A, i32 %i.96
; → {(768 + %A),+,8}<%loop.body> U: full-set S: full-set Exits: (768 + (8 * (zext i32 (-1 + %x) to i64)) + %A) LoopDispositions: { %loop.body: Computable }
; Determining loop execution counts for: @good
; Loop %loop.body: backedge-taken count is (-1 + %x)
; Loop %loop.body: max backedge-taken count is 2147483646
; Loop %loop.body: Predicated backedge-taken count is (-1 + %x)
; Predicates:
;
; Loop %loop.body: Trip multiple is 1
Notice the only difference is on the gep (in bold). Can somebody shed some light?
I attached the test file.
test.ll (3.87 KB)