[polly] [Polly] Narrow IV to lower type when possible (PR #212708)

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 12 22:10:31 PDT 2026


https://github.com/anilkund updated https://github.com/llvm/llvm-project/pull/212708

>From b31c1d18f1f725ead0e976417611f5ac9ab53e47 Mon Sep 17 00:00:00 2001
From: Anilava Kundu <anilkund at hu-anilkund-blr.qualcomm.com>
Date: Wed, 29 Jul 2026 13:54:48 +0530
Subject: [PATCH 1/3] [Polly] Narrow IV to lower type when possible

This patch tries to lower the LLVM-IR type of IVs which are
set to i64 by default during polly codegen. This is specially beneficial
for Hexagon as it uses Hardware Loops which requires 32 bit wide IVs.
---
 polly/lib/CodeGen/IslNodeBuilder.cpp         | 64 +++++++++++++---
 polly/test/CodeGen/iv_narrow_32bit_target.ll | 77 ++++++++++++++++++++
 2 files changed, 129 insertions(+), 12 deletions(-)
 create mode 100644 polly/test/CodeGen/iv_narrow_32bit_target.ll

diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp
index 93822e5c61615..debd385e1205a 100644
--- a/polly/lib/CodeGen/IslNodeBuilder.cpp
+++ b/polly/lib/CodeGen/IslNodeBuilder.cpp
@@ -464,6 +464,25 @@ static bool hasLoopCarriedDependence(isl::ast_node_for For, const Scop &S) {
   return false;
 }
 
+static Value *adjustToType(IRBuilderBase &Builder, Value *V, Type *Ty) {
+  if (V->getType() == Ty)
+    return V;
+  if (V->getType()->getIntegerBitWidth() < Ty->getIntegerBitWidth())
+    return Builder.CreateSExt(V, Ty);
+  return Builder.CreateTrunc(V, Ty);
+}
+
+// Returns true when V is known to fit in IntPtrTy without data loss.
+// Accepts i64 constants such as 0 and 1 that ISL materialises as i64 even on
+// 32-bit targets.
+static bool fitsInPtrTy(Value *V, IntegerType *IntPtrTy) {
+  if (V->getType()->getIntegerBitWidth() <= IntPtrTy->getBitWidth())
+    return true;
+  if (auto *CI = dyn_cast<ConstantInt>(V))
+    return CI->getValue().isSignedIntN(IntPtrTy->getBitWidth());
+  return false;
+}
+
 void IslNodeBuilder::createForSequential(isl::ast_node_for For,
                                          bool MarkParallel) {
   Value *ValueLB, *ValueUB, *ValueInc;
@@ -497,12 +516,23 @@ void IslNodeBuilder::createForSequential(isl::ast_node_for For,
   MaxType = ExprBuilder.getWidestType(MaxType, ValueUB->getType());
   MaxType = ExprBuilder.getWidestType(MaxType, ValueInc->getType());
 
-  if (MaxType != ValueLB->getType())
-    ValueLB = Builder.CreateSExt(ValueLB, MaxType);
-  if (MaxType != ValueUB->getType())
-    ValueUB = Builder.CreateSExt(ValueUB, MaxType);
-  if (MaxType != ValueInc->getType())
-    ValueInc = Builder.CreateSExt(ValueInc, MaxType);
+  // Narrow the IV type to pointer size when all three bounds are known to fit.
+  // On 32-bit targets (e.g. Hexagon) this avoids i64 IVs and the truncations
+  // they cause in loop bodies. This also allows Hexagon to represent loops as
+  // Hardware loops. ISL materializes constants (e.g. LB=0, Inc=1)
+  // as i64 even when they fit in i32, so we accept those via isSignedIntN.
+  // Non-constant variables with a type wider than PtrBits are left unchanged
+  // to avoid an unsafe truncation.
+  IntegerType *IntPtrTy = Builder.getIntPtrTy(DL);
+  if (MaxType->getIntegerBitWidth() > IntPtrTy->getBitWidth() &&
+      fitsInPtrTy(ValueLB, IntPtrTy) && fitsInPtrTy(ValueUB, IntPtrTy) &&
+      fitsInPtrTy(ValueInc, IntPtrTy))
+    MaxType = IntPtrTy;
+
+  // Coerce each bound to MaxType, using trunc when MaxType was narrowed.
+  ValueLB = adjustToType(Builder, ValueLB, MaxType);
+  ValueUB = adjustToType(Builder, ValueUB, MaxType);
+  ValueInc = adjustToType(Builder, ValueInc, MaxType);
 
   // If we can show that LB <Predicate> UB holds at least once, we can
   // omit the GuardBB in front of the loop.
@@ -577,12 +607,22 @@ void IslNodeBuilder::createForParallel(__isl_take isl_ast_node *For) {
   MaxType = ExprBuilder.getWidestType(MaxType, ValueUB->getType());
   MaxType = ExprBuilder.getWidestType(MaxType, ValueInc->getType());
 
-  if (MaxType != ValueLB->getType())
-    ValueLB = Builder.CreateSExt(ValueLB, MaxType);
-  if (MaxType != ValueUB->getType())
-    ValueUB = Builder.CreateSExt(ValueUB, MaxType);
-  if (MaxType != ValueInc->getType())
-    ValueInc = Builder.CreateSExt(ValueInc, MaxType);
+  // Narrow the IV type to pointer size when all three bounds are known to fit.
+  // On 32-bit targets (e.g. Hexagon) this avoids i64 IVs and the truncations
+  // they cause in loop bodies. ISL materializes constants (e.g. LB=0, Inc=1)
+  // as i64 even when they fit in i32, so we accept those via isSignedIntN.
+  // Non-constant variables with a type wider than PtrBits are left unchanged
+  // to avoid an unsafe truncation.
+  IntegerType *IntPtrTy = Builder.getIntPtrTy(DL);
+  if (MaxType->getIntegerBitWidth() > IntPtrTy->getBitWidth() &&
+      fitsInPtrTy(ValueLB, IntPtrTy) && fitsInPtrTy(ValueUB, IntPtrTy) &&
+      fitsInPtrTy(ValueInc, IntPtrTy))
+    MaxType = IntPtrTy;
+
+  // Coerce each bound to MaxType, using trunc when MaxType was narrowed.
+  ValueLB = adjustToType(Builder, ValueLB, MaxType);
+  ValueUB = adjustToType(Builder, ValueUB, MaxType);
+  ValueInc = adjustToType(Builder, ValueInc, MaxType);
 
   BasicBlock::iterator LoopBody;
 
diff --git a/polly/test/CodeGen/iv_narrow_32bit_target.ll b/polly/test/CodeGen/iv_narrow_32bit_target.ll
new file mode 100644
index 0000000000000..25401bd80aa1e
--- /dev/null
+++ b/polly/test/CodeGen/iv_narrow_32bit_target.ll
@@ -0,0 +1,77 @@
+; RUN: opt %loadNPMPolly '-passes=polly<no-default-opts>' -S < %s | FileCheck %s
+
+; Verify that Polly narrows the loop induction variable to i32 on a 32-bit
+; target (e.g. Hexagon) when all loop bounds fit in 32 bits, and that it does
+; NOT narrow when the lower bound is a wide non-constant i64 variable.
+;
+;   void narrow(int *A, int n) {
+;     for (int i = 0; i < n; i++)
+;       A[i] = i;
+;   }
+
+; 32-bit Hexagon-like target: pointer size = 32 bits.
+target datalayout = "e-m:e-p:32:32:32-i64:64:64-i128:128:128-n32-S128"
+target triple = "hexagon-unknown-linux-musl"
+
+; CHECK-LABEL: @narrow
+define void @narrow(ptr noalias %A, i32 %n) {
+entry:
+  br label %for.header
+
+for.header:
+  %i = phi i32 [ 0, %entry ], [ %i.next, %for.body ]
+  %exitcond = icmp slt i32 %i, %n
+  br i1 %exitcond, label %for.body, label %exit
+
+for.body:
+  %gep = getelementptr inbounds i32, ptr %A, i32 %i
+  store i32 %i, ptr %gep
+  %i.next = add nsw i32 %i, 1
+  br label %for.header
+
+exit:
+  ret void
+}
+
+; The IV must be i32 and all loop arithmetic must stay in i32.
+; CHECK:      polly.loop_header:
+; CHECK-NEXT:   %polly.indvar = phi i32
+; CHECK:        %polly.indvar_next = add nsw i32 %polly.indvar
+; CHECK:        %polly.loop_cond = icmp slt i32 %polly.indvar_next
+
+
+; When the lower bound is a non-constant i64 variable the guard must block
+; narrowing to avoid an unsafe truncation of %start.
+;
+;   void no_narrow_wide_lb(int *A, long start, int n) {
+;     for (long i = start; i < n; i++)
+;       A[i] = (int)i;
+;   }
+
+; CHECK-LABEL: @no_narrow_wide_lb
+define void @no_narrow_wide_lb(ptr noalias %A, i64 %start, i32 %n) {
+entry:
+  br label %for.header
+
+for.header:
+  %i = phi i64 [ %start, %entry ], [ %i.next, %for.body ]
+  %n64 = sext i32 %n to i64
+  %exitcond = icmp slt i64 %i, %n64
+  br i1 %exitcond, label %for.body, label %exit
+
+for.body:
+  %gep = getelementptr inbounds i32, ptr %A, i64 %i
+  %ival = trunc i64 %i to i32
+  store i32 %ival, ptr %gep
+  %i.next = add nsw i64 %i, 1
+  br label %for.header
+
+exit:
+  ret void
+}
+
+; The IV must remain i64 because %start is a wide non-constant variable.
+; Polly normalises the loop to start from 0, but keeps the type as i64.
+; CHECK:      polly.loop_header:
+; CHECK-NEXT:   %polly.indvar = phi i64
+; CHECK:        %polly.indvar_next = add nsw i64 %polly.indvar

>From 3ed059be7a07f16d93f5218088ae64faf14b103e Mon Sep 17 00:00:00 2001
From: Anilava Kundu <anilkund at hu-anilkund-blr.qualcomm.com>
Date: Wed, 29 Jul 2026 13:54:48 +0530
Subject: [PATCH 2/3] [Polly] Narrow IV to lower type when possible

This patch tries to lower the LLVM-IR type of IVs which are
set to i64 by default during polly codegen. This is specially beneficial
for Hexagon as it uses Hardware Loops which requires 32 bit wide IVs.
---
 polly/lib/CodeGen/IslNodeBuilder.cpp | 42 +++++++++++++++-------------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp
index debd385e1205a..50de49b37a6c2 100644
--- a/polly/lib/CodeGen/IslNodeBuilder.cpp
+++ b/polly/lib/CodeGen/IslNodeBuilder.cpp
@@ -464,22 +464,24 @@ static bool hasLoopCarriedDependence(isl::ast_node_for For, const Scop &S) {
   return false;
 }
 
-static Value *adjustToType(IRBuilderBase &Builder, Value *V, Type *Ty) {
+/// Sign-extend or truncate V to Ty.
+///
+/// Returns V unchanged if it already has type Ty, sign-extends it if
+/// Ty is wider, or truncates it if Ty is narrower.
+static Value *castToType(IRBuilderBase &Builder, Value *V, Type *Ty) {
   if (V->getType() == Ty)
     return V;
-  if (V->getType()->getIntegerBitWidth() < Ty->getIntegerBitWidth())
-    return Builder.CreateSExt(V, Ty);
-  return Builder.CreateTrunc(V, Ty);
+  return Builder.CreateSExtOrTrunc(V, Ty);
 }
 
-// Returns true when V is known to fit in IntPtrTy without data loss.
-// Accepts i64 constants such as 0 and 1 that ISL materialises as i64 even on
-// 32-bit targets.
-static bool fitsInPtrTy(Value *V, IntegerType *IntPtrTy) {
-  if (V->getType()->getIntegerBitWidth() <= IntPtrTy->getBitWidth())
+/// Returns true when V is known to fit in IntPtrTy without data loss.
+/// Accepts i64 constants such as 0 and 1 that ISL materialises as i64 even on
+/// 32-bit targets.
+static bool fitsInTy(Value *V, IntegerType *IntTy) {
+  if (V->getType()->getIntegerBitWidth() <= IntTy->getBitWidth())
     return true;
   if (auto *CI = dyn_cast<ConstantInt>(V))
-    return CI->getValue().isSignedIntN(IntPtrTy->getBitWidth());
+    return CI->getValue().isSignedIntN(IntTy->getBitWidth());
   return false;
 }
 
@@ -525,14 +527,14 @@ void IslNodeBuilder::createForSequential(isl::ast_node_for For,
   // to avoid an unsafe truncation.
   IntegerType *IntPtrTy = Builder.getIntPtrTy(DL);
   if (MaxType->getIntegerBitWidth() > IntPtrTy->getBitWidth() &&
-      fitsInPtrTy(ValueLB, IntPtrTy) && fitsInPtrTy(ValueUB, IntPtrTy) &&
-      fitsInPtrTy(ValueInc, IntPtrTy))
+      fitsInTy(ValueLB, IntPtrTy) && fitsInTy(ValueUB, IntPtrTy) &&
+      fitsInTy(ValueInc, IntPtrTy))
     MaxType = IntPtrTy;
 
   // Coerce each bound to MaxType, using trunc when MaxType was narrowed.
-  ValueLB = adjustToType(Builder, ValueLB, MaxType);
-  ValueUB = adjustToType(Builder, ValueUB, MaxType);
-  ValueInc = adjustToType(Builder, ValueInc, MaxType);
+  ValueLB = castToType(Builder, ValueLB, MaxType);
+  ValueUB = castToType(Builder, ValueUB, MaxType);
+  ValueInc = castToType(Builder, ValueInc, MaxType);
 
   // If we can show that LB <Predicate> UB holds at least once, we can
   // omit the GuardBB in front of the loop.
@@ -615,14 +617,14 @@ void IslNodeBuilder::createForParallel(__isl_take isl_ast_node *For) {
   // to avoid an unsafe truncation.
   IntegerType *IntPtrTy = Builder.getIntPtrTy(DL);
   if (MaxType->getIntegerBitWidth() > IntPtrTy->getBitWidth() &&
-      fitsInPtrTy(ValueLB, IntPtrTy) && fitsInPtrTy(ValueUB, IntPtrTy) &&
-      fitsInPtrTy(ValueInc, IntPtrTy))
+      fitsInTy(ValueLB, IntPtrTy) && fitsInTy(ValueUB, IntPtrTy) &&
+      fitsInTy(ValueInc, IntPtrTy))
     MaxType = IntPtrTy;
 
   // Coerce each bound to MaxType, using trunc when MaxType was narrowed.
-  ValueLB = adjustToType(Builder, ValueLB, MaxType);
-  ValueUB = adjustToType(Builder, ValueUB, MaxType);
-  ValueInc = adjustToType(Builder, ValueInc, MaxType);
+  ValueLB = castToType(Builder, ValueLB, MaxType);
+  ValueUB = castToType(Builder, ValueUB, MaxType);
+  ValueInc = castToType(Builder, ValueInc, MaxType);
 
   BasicBlock::iterator LoopBody;
 

>From 7d6988b262bbd99360ae70bb586c76f7e496eba0 Mon Sep 17 00:00:00 2001
From: Anilava Kundu <anilkund at hu-anilkund-blr.qualcomm.com>
Date: Thu, 13 Aug 2026 10:35:28 +0530
Subject: [PATCH 3/3] [Polly] Fix failing tests

Fix tests failing because of IV narrowing
---
 .../CodeGen/MemAccess/codegen_simple_md.ll    | 20 +++++++++++--------
 .../MemAccess/codegen_simple_md_float.ll      | 20 +++++++++++--------
 polly/test/ScopInfo/int2ptr_ptr2int.ll        |  4 ++--
 polly/test/ScopInfo/int2ptr_ptr2int_2.ll      |  4 ++--
 4 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/polly/test/CodeGen/MemAccess/codegen_simple_md.ll b/polly/test/CodeGen/MemAccess/codegen_simple_md.ll
index a6d9969286fc7..681e3e01790d4 100644
--- a/polly/test/CodeGen/MemAccess/codegen_simple_md.ll
+++ b/polly/test/CodeGen/MemAccess/codegen_simple_md.ll
@@ -54,19 +54,23 @@ for.end6:                                         ; preds = %for.cond
   ret i32 0
 }
 
-; WITHCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[IVOut]]
-; WITHCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[IVIn]]
+; WITHCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHCONST:  %[[EXTOut:[._a-zA-Z0-9]+]] = sext i32 %[[IVOut]] to i64
+; WITHCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[EXTOut]]
+; WITHCONST:  %[[EXTIn:[._a-zA-Z0-9]+]] = sext i32 %[[IVIn]] to i64
+; WITHCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[EXTIn]]
 ; WITHCONST:  %[[SUM1:[._a-zA-Z0-9]+]] = add nsw i64 %[[MUL1]], %[[MUL2]]
 ; WITHCONST:  %[[SUM2:[._a-zA-Z0-9]+]] = add nsw i64 %[[SUM1]], 5
 ; WITHCONST:  %[[ACC:[._a-zA-Z0-9]*]] = getelementptr i32, ptr @A, i64 %[[SUM2]]
 ; WITHCONST:  store i32 100, ptr %[[ACC]]
 
-; WITHOUTCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHOUTCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHOUTCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[IVOut]]
-; WITHOUTCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[IVIn]]
+; WITHOUTCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHOUTCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHOUTCONST:  %[[EXTOut:[._a-zA-Z0-9]+]] = sext i32 %[[IVOut]] to i64
+; WITHOUTCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[EXTOut]]
+; WITHOUTCONST:  %[[EXTIn:[._a-zA-Z0-9]+]] = sext i32 %[[IVIn]] to i64
+; WITHOUTCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[EXTIn]]
 ; WITHOUTCONST:  %[[SUM1:[._a-zA-Z0-9]+]] = add nsw i64 %[[MUL1]], %[[MUL2]]
 ; WITHOUTCONST:  %[[ACC:[._a-zA-Z0-9]*]] = getelementptr i32, ptr @A, i64 %[[SUM1]]
 ; WITHOUTCONST:  store i32 100, ptr %[[ACC]]
diff --git a/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll b/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll
index 568b0ff4ae20a..26babfbbbedc2 100644
--- a/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll
+++ b/polly/test/CodeGen/MemAccess/codegen_simple_md_float.ll
@@ -51,19 +51,23 @@ for.end6:                                         ; preds = %for.cond
   ret void
 }
 
-; WITHCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[IVOut]]
-; WITHCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[IVIn]]
+; WITHCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHCONST:  %[[EXTOut:[._a-zA-Z0-9]+]] = sext i32 %[[IVOut]] to i64
+; WITHCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[EXTOut]]
+; WITHCONST:  %[[EXTIn:[._a-zA-Z0-9]+]] = sext i32 %[[IVIn]] to i64
+; WITHCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[EXTIn]]
 ; WITHCONST:  %[[SUM1:[._a-zA-Z0-9]+]] = add nsw i64 %[[MUL1]], %[[MUL2]]
 ; WITHCONST:  %[[SUM2:[._a-zA-Z0-9]+]] = add nsw i64 %[[SUM1]], 5
 ; WITHCONST:  %[[ACC:[._a-zA-Z0-9]*]] = getelementptr float, ptr @A, i64 %[[SUM2]]
 ; WITHCONST:  store float 1.000000e+02, ptr %[[ACC]]
 
-; WITHOUTCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHOUTCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i64 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
-; WITHOUTCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[IVOut]]
-; WITHOUTCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[IVIn]]
+; WITHOUTCONST:  %[[IVOut:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHOUTCONST:  %[[IVIn:polly.indvar[0-9]*]] = phi i32 [ 0, %polly.loop_preheader{{[0-9]*}} ], [ %polly.indvar_next{{[0-9]*}}, %polly.{{[._a-zA-Z0-9]*}} ]
+; WITHOUTCONST:  %[[EXTOut:[._a-zA-Z0-9]+]] = sext i32 %[[IVOut]] to i64
+; WITHOUTCONST:  %[[MUL1:[._a-zA-Z0-9]+]] = mul nsw i64 16, %[[EXTOut]]
+; WITHOUTCONST:  %[[EXTIn:[._a-zA-Z0-9]+]] = sext i32 %[[IVIn]] to i64
+; WITHOUTCONST:  %[[MUL2:[._a-zA-Z0-9]+]] = mul nsw i64 2, %[[EXTIn]]
 ; WITHOUTCONST:  %[[SUM1:[._a-zA-Z0-9]+]] = add nsw i64 %[[MUL1]], %[[MUL2]]
 ; WITHOUTCONST:  %[[ACC:[._a-zA-Z0-9]*]] = getelementptr float, ptr @A, i64 %[[SUM1]]
 ; WITHOUTCONST:  store float 1.000000e+02, ptr %[[ACC]]
diff --git a/polly/test/ScopInfo/int2ptr_ptr2int.ll b/polly/test/ScopInfo/int2ptr_ptr2int.ll
index 7c3e4b060b662..47b5c25f69a63 100644
--- a/polly/test/ScopInfo/int2ptr_ptr2int.ll
+++ b/polly/test/ScopInfo/int2ptr_ptr2int.ll
@@ -26,8 +26,8 @@
 ; IR-NEXT:   %tmp4_p_scalar_ = load i64, ptr %scevgep, align 8, !alias.scope !2, !noalias !5
 ; IR-NEXT:   %p_add4 = add nsw i64 %tmp4_p_scalar_, %tmp3_p_scalar_
 ; IR-NEXT:   store i64 %p_add4, ptr %scevgep, align 8, !alias.scope !2, !noalias !5
-; IR-NEXT:   %polly.indvar_next = add nsw i64 %polly.indvar, 1
-; IR-NEXT:   %polly.loop_cond = icmp sle i64 %polly.indvar_next, 99
+; IR-NEXT:   %polly.indvar_next = add nsw i32 %polly.indvar, 1
+; IR-NEXT:   %polly.loop_cond = icmp sle i32 %polly.indvar_next, 99
 ; IR-NEXT:   br i1 %polly.loop_cond, label %polly.loop_header, label %polly.loop_exit
 ;
 ; IR:      polly.loop_preheader:
diff --git a/polly/test/ScopInfo/int2ptr_ptr2int_2.ll b/polly/test/ScopInfo/int2ptr_ptr2int_2.ll
index 77293529e9cf7..ee0dc7c124f96 100644
--- a/polly/test/ScopInfo/int2ptr_ptr2int_2.ll
+++ b/polly/test/ScopInfo/int2ptr_ptr2int_2.ll
@@ -22,8 +22,8 @@
 ; IR-NEXT:   %tmp4_p_scalar_ = load i64, ptr %scevgep, align 8, !alias.scope !5, !noalias !2
 ; IR-NEXT:   %p_add4 = add nsw i64 %tmp4_p_scalar_, %polly.preload.tmp3.merge
 ; IR-NEXT:   store i64 %p_add4, ptr %scevgep, align 8, !alias.scope !5, !noalias !2
-; IR-NEXT:   %polly.indvar_next = add nsw i64 %polly.indvar, 1
-; IR-NEXT:   %polly.loop_cond = icmp sle i64 %polly.indvar_next, 99
+; IR-NEXT:   %polly.indvar_next = add nsw i16 %polly.indvar, 1
+; IR-NEXT:   %polly.loop_cond = icmp sle i16 %polly.indvar_next, 99
 ; IR-NEXT:   br i1 %polly.loop_cond, label %polly.loop_header, label %polly.loop_exit
 
 ; IR:      polly.loop_preheader:



More information about the llvm-commits mailing list