mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-25 19:29:53 +00:00
[IndVar] Don't widen loop compare unless IV user is sign extended.
PR21030 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218539 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
07b7c98d61
commit
4150a8de76
@ -650,7 +650,7 @@ namespace {
|
||||
struct WideIVInfo {
|
||||
PHINode *NarrowIV;
|
||||
Type *WidestNativeType; // Widest integer type created [sz]ext
|
||||
bool IsSigned; // Was an sext user seen before a zext?
|
||||
bool IsSigned; // Was a sext user seen before a zext?
|
||||
|
||||
WideIVInfo() : NarrowIV(nullptr), WidestNativeType(nullptr),
|
||||
IsSigned(false) {}
|
||||
@ -936,7 +936,11 @@ bool WidenIV::WidenLoopCompare(NarrowIVDefUse DU) {
|
||||
if (!Cmp)
|
||||
return false;
|
||||
|
||||
bool IsSigned = CmpInst::isSigned(Cmp->getPredicate());
|
||||
// Must be a signed compare.
|
||||
if (!CmpInst::isSigned(Cmp->getPredicate()))
|
||||
return false;
|
||||
|
||||
// Must be a signed IV user.
|
||||
if (!IsSigned)
|
||||
return false;
|
||||
|
||||
|
@ -136,3 +136,29 @@ for.body:
|
||||
for.end:
|
||||
ret i32 %sum.0
|
||||
}
|
||||
|
||||
declare i32 @fn1(i8 signext)
|
||||
|
||||
; PR21030
|
||||
; CHECK-LABEL: @test4
|
||||
; CHECK: for.body:
|
||||
; CHECK: phi i32
|
||||
; CHECK: icmp sgt i8
|
||||
|
||||
define i32 @test4(i32 %a) {
|
||||
entry:
|
||||
br label %for.body
|
||||
|
||||
for.body:
|
||||
%c.07 = phi i8 [ -3, %entry ], [ %dec, %for.body ]
|
||||
%conv6 = zext i8 %c.07 to i32
|
||||
%or = or i32 %a, %conv6
|
||||
%conv3 = trunc i32 %or to i8
|
||||
%call = call i32 @fn1(i8 signext %conv3)
|
||||
%dec = add i8 %c.07, -1
|
||||
%cmp = icmp sgt i8 %dec, -14
|
||||
br i1 %cmp, label %for.body, label %for.end
|
||||
|
||||
for.end:
|
||||
ret i32 0
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user