forked from OSchip/llvm-project
[IndVar] Don't widen loop compare unless IV user is sign extended.
PR21030 llvm-svn: 218539
This commit is contained in:
parent
7e38e429b7
commit
7b974b73ae
|
@ -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…
Reference in New Issue