mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-06 05:33:28 +00:00
The bug was a result of getPreStartForExtend interpreting nsw/nuw flags on an add recurrence more strongly than is legal. {S,+,X}<nsw> implies S+X is nsw only if the backedge of the loop is taken at least once. NOTE: I had accidentally committed an unrelated change with the commit message of this change in r230275 (r230275 was reverted in r230279). This is the correct change for this commit message. Differential Revision: http://reviews.llvm.org/D7808 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230291 91177308-0d34-0410-b5e6-96231b3b80d8
102 lines
2.9 KiB
LLVM
102 lines
2.9 KiB
LLVM
; ; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
|
|
|
|
define void @infer.sext.0(i1* %c, i32 %start) {
|
|
; CHECK-LABEL: Classifying expressions for: @infer.sext.0
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
%counter = phi i32 [ 0, %entry ], [ %counter.inc, %loop ]
|
|
%idx = phi i32 [ %start, %entry ], [ %idx.inc, %loop ]
|
|
%idx.inc = add nsw i32 %idx, 1
|
|
%idx.inc.sext = sext i32 %idx.inc to i64
|
|
; CHECK: %idx.inc.sext = sext i32 %idx.inc to i64
|
|
; CHECK-NEXT: --> {(1 + (sext i32 %start to i64)),+,1}<nsw><%loop>
|
|
%condition = icmp eq i32 %counter, 1
|
|
%counter.inc = add i32 %counter, 1
|
|
br i1 %condition, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @infer.zext.0(i1* %c, i32 %start) {
|
|
; CHECK-LABEL: Classifying expressions for: @infer.zext.0
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
%counter = phi i32 [ 0, %entry ], [ %counter.inc, %loop ]
|
|
%idx = phi i32 [ %start, %entry ], [ %idx.inc, %loop ]
|
|
%idx.inc = add nuw i32 %idx, 1
|
|
%idx.inc.sext = zext i32 %idx.inc to i64
|
|
; CHECK: %idx.inc.sext = zext i32 %idx.inc to i64
|
|
; CHECK-NEXT: --> {(1 + (zext i32 %start to i64)),+,1}<nuw><%loop>
|
|
%condition = icmp eq i32 %counter, 1
|
|
%counter.inc = add i32 %counter, 1
|
|
br i1 %condition, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @infer.sext.1(i32 %start, i1* %c) {
|
|
; CHECK-LABEL: Classifying expressions for: @infer.sext.1
|
|
entry:
|
|
%start.mul = mul i32 %start, 4
|
|
%start.real = add i32 %start.mul, 2
|
|
br label %loop
|
|
|
|
loop:
|
|
%idx = phi i32 [ %start.real, %entry ], [ %idx.inc, %loop ]
|
|
%idx.sext = sext i32 %idx to i64
|
|
; CHECK: %idx.sext = sext i32 %idx to i64
|
|
; CHECK-NEXT: --> {(2 + (sext i32 (4 * %start) to i64)),+,2}<nsw><%loop>
|
|
%idx.inc = add nsw i32 %idx, 2
|
|
%condition = load i1* %c
|
|
br i1 %condition, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @infer.sext.2(i1* %c, i8 %start) {
|
|
; CHECK-LABEL: Classifying expressions for: @infer.sext.2
|
|
entry:
|
|
%start.inc = add i8 %start, 1
|
|
%entry.condition = icmp slt i8 %start, 127
|
|
br i1 %entry.condition, label %loop, label %exit
|
|
|
|
loop:
|
|
%idx = phi i8 [ %start.inc, %entry ], [ %idx.inc, %loop ]
|
|
%idx.sext = sext i8 %idx to i16
|
|
; CHECK: %idx.sext = sext i8 %idx to i16
|
|
; CHECK-NEXT: --> {(1 + (sext i8 %start to i16)),+,1}<nsw><%loop>
|
|
%idx.inc = add nsw i8 %idx, 1
|
|
%condition = load volatile i1* %c
|
|
br i1 %condition, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @infer.zext.1(i1* %c, i8 %start) {
|
|
; CHECK-LABEL: Classifying expressions for: @infer.zext.1
|
|
entry:
|
|
%start.inc = add i8 %start, 1
|
|
%entry.condition = icmp ult i8 %start, 255
|
|
br i1 %entry.condition, label %loop, label %exit
|
|
|
|
loop:
|
|
%idx = phi i8 [ %start.inc, %entry ], [ %idx.inc, %loop ]
|
|
%idx.zext = zext i8 %idx to i16
|
|
; CHECK: %idx.zext = zext i8 %idx to i16
|
|
; CHECK-NEXT: --> {(1 + (zext i8 %start to i16)),+,1}<nuw><%loop>
|
|
%idx.inc = add nuw i8 %idx, 1
|
|
%condition = load volatile i1* %c
|
|
br i1 %condition, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|