[llvm] 7324616 - [SCEV] BuildConstantFromSCEV(): properly handle SCEVZeroExtend from ptr

Roman Lebedev via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 13 01:48:11 PDT 2020


Author: Roman Lebedev
Date: 2020-10-13T11:47:44+03:00
New Revision: 7324616660fc0995fa8c166e3c392361222d5dbc

URL: https://github.com/llvm/llvm-project/commit/7324616660fc0995fa8c166e3c392361222d5dbc
DIFF: https://github.com/llvm/llvm-project/commit/7324616660fc0995fa8c166e3c392361222d5dbc.diff

LOG: [SCEV] BuildConstantFromSCEV(): properly handle SCEVZeroExtend from ptr

As being reported in https://reviews.llvm.org/D88806#2326944,
this is pretty much the sibling problem of https://reviews.llvm.org/D88806#2325340,
with root cause being that SCEV now models `ptrtoint` as trunc/zext/self of unknown.

The appropriate (currently crashing) test coverage added.

Added: 
    

Modified: 
    llvm/lib/Analysis/ScalarEvolution.cpp
    llvm/test/Analysis/ScalarEvolution/ptrtoint-constantexpr-loop.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 74bffc0facdb..5f4b97dda335 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -7993,8 +7993,11 @@ static Constant *BuildConstantFromSCEV(const SCEV *V) {
     }
     case scZeroExtend: {
       const SCEVZeroExtendExpr *SZ = cast<SCEVZeroExtendExpr>(V);
-      if (Constant *CastOp = BuildConstantFromSCEV(SZ->getOperand()))
-        return ConstantExpr::getZExt(CastOp, SZ->getType());
+      if (Constant *CastOp = BuildConstantFromSCEV(SZ->getOperand())) {
+        if (!CastOp->getType()->isPointerTy())
+          return ConstantExpr::getZExt(CastOp, SZ->getType());
+        return ConstantExpr::getPtrToInt(CastOp, SZ->getType());
+      }
       break;
     }
     case scTruncate: {

diff  --git a/llvm/test/Analysis/ScalarEvolution/ptrtoint-constantexpr-loop.ll b/llvm/test/Analysis/ScalarEvolution/ptrtoint-constantexpr-loop.ll
index d0ead6028071..55963fc958c1 100644
--- a/llvm/test/Analysis/ScalarEvolution/ptrtoint-constantexpr-loop.ll
+++ b/llvm/test/Analysis/ScalarEvolution/ptrtoint-constantexpr-loop.ll
@@ -1,18 +1,20 @@
 ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
-; RUN: opt < %s --data-layout="e-m:e-p:64:64:64:64-n8:16:32:64" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X64,PTR64_IDX64 %s
-; RUN: opt < %s --data-layout="e-m:e-p:64:64:64:64-n8:16:32:64" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X64,PTR64_IDX64 %s
-; RUN: opt < %s --data-layout="e-m:e-p:64:64:64:32-n8:16:32:64" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X64,PTR64_IDX32 %s
-; RUN: opt < %s --data-layout="e-m:e-p:64:64:64:32-n8:16:32:64" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X64,PTR64_IDX32 %s
-; RUN: opt < %s --data-layout="e-m:e-p:32:32:32:32-n8:16:32" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X32,PTR32_IDX32 %s
-; RUN: opt < %s --data-layout="e-m:e-p:32:32:32:32-n8:16:32" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X32,PTR32_IDX32 %s
-; RUN: opt < %s --data-layout="e-m:e-p:32:32:32:64-n8:16:32:64" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X32,PTR32_IDX64 %s
-; RUN: opt < %s --data-layout="e-m:e-p:32:32:32:64-n8:16:32:64" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X32,PTR32_IDX64 %s
+; RUN: opt < %s --data-layout="p:64:64:64:64" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X64,PTR64_IDX64 %s
+; RUN: opt < %s --data-layout="p:64:64:64:64" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X64,PTR64_IDX64 %s
+; RUN: opt < %s --data-layout="p:64:64:64:32" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X64,PTR64_IDX32 %s
+; RUN: opt < %s --data-layout="p:64:64:64:32" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X64,PTR64_IDX32 %s
+; RUN: opt < %s --data-layout="p:16:16:16:16" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X32,PTR16_IDX16 %s
+; RUN: opt < %s --data-layout="p:16:16:16:16" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X32,PTR16_IDX16 %s
+; RUN: opt < %s --data-layout="p:16:16:16:32" -S -analyze -enable-new-pm=0 -scalar-evolution | FileCheck --check-prefixes=ALL,X32,PTR16_IDX32 %s
+; RUN: opt < %s --data-layout="p:16:16:16:32" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X32,PTR16_IDX32 %s
 
 @global = external hidden global [0 x i8]
 
-define hidden i32* @i64(i8* %arg, i32* %arg10) {
-; X64-LABEL: 'i64'
-; X64-NEXT:  Classifying expressions for: @i64
+declare void @use16(i16)
+
+define hidden i32* @v0_ptr_to_i64(i8* %arg, i32* %arg10) {
+; X64-LABEL: 'v0_ptr_to_i64'
+; X64-NEXT:  Classifying expressions for: @v0_ptr_to_i64
 ; X64-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
 ; X64-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
 ; X64-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
@@ -23,44 +25,44 @@ define hidden i32* @i64(i8* %arg, i32* %arg10) {
 ; X64-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
 ; X64-NEXT:    %tmp18 = add i32 %tmp, 2
 ; X64-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; X64-NEXT:  Determining loop execution counts for: @i64
+; X64-NEXT:  Determining loop execution counts for: @v0_ptr_to_i64
 ; X64-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
 ; X64-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
 ; X64-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
-; PTR32_IDX32-LABEL: 'i64'
-; PTR32_IDX32-NEXT:  Classifying expressions for: @i64
-; PTR32_IDX32-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
-; PTR32_IDX32-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX32-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
-; PTR32_IDX32-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX32-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
-; PTR32_IDX32-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX32-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
-; PTR32_IDX32-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
-; PTR32_IDX32-NEXT:    %tmp18 = add i32 %tmp, 2
-; PTR32_IDX32-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX32-NEXT:  Determining loop execution counts for: @i64
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
+; PTR16_IDX16-LABEL: 'v0_ptr_to_i64'
+; PTR16_IDX16-NEXT:  Classifying expressions for: @v0_ptr_to_i64
+; PTR16_IDX16-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
+; PTR16_IDX16-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX16-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
+; PTR16_IDX16-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX16-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
+; PTR16_IDX16-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX16-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
+; PTR16_IDX16-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
+; PTR16_IDX16-NEXT:    %tmp18 = add i32 %tmp, 2
+; PTR16_IDX16-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX16-NEXT:  Determining loop execution counts for: @v0_ptr_to_i64
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
-; PTR32_IDX64-LABEL: 'i64'
-; PTR32_IDX64-NEXT:  Classifying expressions for: @i64
-; PTR32_IDX64-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
-; PTR32_IDX64-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX64-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
-; PTR32_IDX64-NEXT:    --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX64-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
-; PTR32_IDX64-NEXT:    --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX64-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
-; PTR32_IDX64-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
-; PTR32_IDX64-NEXT:    %tmp18 = add i32 %tmp, 2
-; PTR32_IDX64-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX64-NEXT:  Determining loop execution counts for: @i64
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
+; PTR16_IDX32-LABEL: 'v0_ptr_to_i64'
+; PTR16_IDX32-NEXT:  Classifying expressions for: @v0_ptr_to_i64
+; PTR16_IDX32-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
+; PTR16_IDX32-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX32-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i64 ptrtoint ([0 x i8]* @global to i64)
+; PTR16_IDX32-NEXT:    --> (@global + %arg) U: [0,131071) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX32-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
+; PTR16_IDX32-NEXT:    --> (@global + %arg) U: [0,131071) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX32-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
+; PTR16_IDX32-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
+; PTR16_IDX32-NEXT:    %tmp18 = add i32 %tmp, 2
+; PTR16_IDX32-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX32-NEXT:  Determining loop execution counts for: @v0_ptr_to_i64
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
 bb:
   br label %bb11
@@ -80,9 +82,9 @@ bb17:                                             ; preds = %bb11
   %tmp18 = add i32 %tmp, 2
   br label %bb11
 }
-define hidden i32* @i64_to_i32(i8* %arg, i32* %arg10) {
-; PTR64_IDX64-LABEL: 'i64_to_i32'
-; PTR64_IDX64-NEXT:  Classifying expressions for: @i64_to_i32
+define hidden i32* @v0_ptr_to_i32(i8* %arg, i32* %arg10) {
+; PTR64_IDX64-LABEL: 'v0_ptr_to_i32'
+; PTR64_IDX64-NEXT:  Classifying expressions for: @v0_ptr_to_i32
 ; PTR64_IDX64-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
 ; PTR64_IDX64-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
 ; PTR64_IDX64-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
@@ -93,13 +95,13 @@ define hidden i32* @i64_to_i32(i8* %arg, i32* %arg10) {
 ; PTR64_IDX64-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
 ; PTR64_IDX64-NEXT:    %tmp18 = add i32 %tmp, 2
 ; PTR64_IDX64-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR64_IDX64-NEXT:  Determining loop execution counts for: @i64_to_i32
+; PTR64_IDX64-NEXT:  Determining loop execution counts for: @v0_ptr_to_i32
 ; PTR64_IDX64-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
 ; PTR64_IDX64-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
 ; PTR64_IDX64-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
-; PTR64_IDX32-LABEL: 'i64_to_i32'
-; PTR64_IDX32-NEXT:  Classifying expressions for: @i64_to_i32
+; PTR64_IDX32-LABEL: 'v0_ptr_to_i32'
+; PTR64_IDX32-NEXT:  Classifying expressions for: @v0_ptr_to_i32
 ; PTR64_IDX32-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
 ; PTR64_IDX32-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
 ; PTR64_IDX32-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
@@ -110,44 +112,44 @@ define hidden i32* @i64_to_i32(i8* %arg, i32* %arg10) {
 ; PTR64_IDX32-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
 ; PTR64_IDX32-NEXT:    %tmp18 = add i32 %tmp, 2
 ; PTR64_IDX32-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR64_IDX32-NEXT:  Determining loop execution counts for: @i64_to_i32
+; PTR64_IDX32-NEXT:  Determining loop execution counts for: @v0_ptr_to_i32
 ; PTR64_IDX32-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
 ; PTR64_IDX32-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
 ; PTR64_IDX32-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
-; PTR32_IDX32-LABEL: 'i64_to_i32'
-; PTR32_IDX32-NEXT:  Classifying expressions for: @i64_to_i32
-; PTR32_IDX32-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
-; PTR32_IDX32-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX32-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
-; PTR32_IDX32-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX32-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
-; PTR32_IDX32-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX32-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
-; PTR32_IDX32-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
-; PTR32_IDX32-NEXT:    %tmp18 = add i32 %tmp, 2
-; PTR32_IDX32-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX32-NEXT:  Determining loop execution counts for: @i64_to_i32
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
+; PTR16_IDX16-LABEL: 'v0_ptr_to_i32'
+; PTR16_IDX16-NEXT:  Classifying expressions for: @v0_ptr_to_i32
+; PTR16_IDX16-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
+; PTR16_IDX16-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX16-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
+; PTR16_IDX16-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX16-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
+; PTR16_IDX16-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX16-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
+; PTR16_IDX16-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
+; PTR16_IDX16-NEXT:    %tmp18 = add i32 %tmp, 2
+; PTR16_IDX16-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX16-NEXT:  Determining loop execution counts for: @v0_ptr_to_i32
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
-; PTR32_IDX64-LABEL: 'i64_to_i32'
-; PTR32_IDX64-NEXT:  Classifying expressions for: @i64_to_i32
-; PTR32_IDX64-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
-; PTR32_IDX64-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX64-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
-; PTR32_IDX64-NEXT:    --> ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) U: [-2147483648,6442450943) S: full-set Exits: ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX64-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
-; PTR32_IDX64-NEXT:    --> ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) U: [-2147483648,6442450943) S: full-set Exits: ((sext i32 (trunc [0 x i8]* @global to i32) to i64) + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX64-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
-; PTR32_IDX64-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
-; PTR32_IDX64-NEXT:    %tmp18 = add i32 %tmp, 2
-; PTR32_IDX64-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX64-NEXT:  Determining loop execution counts for: @i64_to_i32
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
+; PTR16_IDX32-LABEL: 'v0_ptr_to_i32'
+; PTR16_IDX32-NEXT:  Classifying expressions for: @v0_ptr_to_i32
+; PTR16_IDX32-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
+; PTR16_IDX32-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX32-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i32 ptrtoint ([0 x i8]* @global to i32)
+; PTR16_IDX32-NEXT:    --> (@global + %arg) U: [0,131071) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX32-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
+; PTR16_IDX32-NEXT:    --> (@global + %arg) U: [0,131071) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX32-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
+; PTR16_IDX32-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
+; PTR16_IDX32-NEXT:    %tmp18 = add i32 %tmp, 2
+; PTR16_IDX32-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX32-NEXT:  Determining loop execution counts for: @v0_ptr_to_i32
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
 bb:
   br label %bb11
@@ -167,9 +169,9 @@ bb17:                                             ; preds = %bb11
   %tmp18 = add i32 %tmp, 2
   br label %bb11
 }
-define hidden i32* @i64_to_i128(i8* %arg, i32* %arg10) {
-; X64-LABEL: 'i64_to_i128'
-; X64-NEXT:  Classifying expressions for: @i64_to_i128
+define hidden i32* @v0_ptr_to_i128(i8* %arg, i32* %arg10) {
+; X64-LABEL: 'v0_ptr_to_i128'
+; X64-NEXT:  Classifying expressions for: @v0_ptr_to_i128
 ; X64-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
 ; X64-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
 ; X64-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
@@ -180,44 +182,44 @@ define hidden i32* @i64_to_i128(i8* %arg, i32* %arg10) {
 ; X64-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
 ; X64-NEXT:    %tmp18 = add i32 %tmp, 2
 ; X64-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; X64-NEXT:  Determining loop execution counts for: @i64_to_i128
+; X64-NEXT:  Determining loop execution counts for: @v0_ptr_to_i128
 ; X64-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
 ; X64-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
 ; X64-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
-; PTR32_IDX32-LABEL: 'i64_to_i128'
-; PTR32_IDX32-NEXT:  Classifying expressions for: @i64_to_i128
-; PTR32_IDX32-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
-; PTR32_IDX32-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX32-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
-; PTR32_IDX32-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX32-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
-; PTR32_IDX32-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX32-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
-; PTR32_IDX32-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
-; PTR32_IDX32-NEXT:    %tmp18 = add i32 %tmp, 2
-; PTR32_IDX32-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX32-NEXT:  Determining loop execution counts for: @i64_to_i128
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
-; PTR32_IDX32-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
+; PTR16_IDX16-LABEL: 'v0_ptr_to_i128'
+; PTR16_IDX16-NEXT:  Classifying expressions for: @v0_ptr_to_i128
+; PTR16_IDX16-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
+; PTR16_IDX16-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX16-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
+; PTR16_IDX16-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX16-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
+; PTR16_IDX16-NEXT:    --> (@global + %arg) U: full-set S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX16-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
+; PTR16_IDX16-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
+; PTR16_IDX16-NEXT:    %tmp18 = add i32 %tmp, 2
+; PTR16_IDX16-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX16-NEXT:  Determining loop execution counts for: @v0_ptr_to_i128
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
-; PTR32_IDX64-LABEL: 'i64_to_i128'
-; PTR32_IDX64-NEXT:  Classifying expressions for: @i64_to_i128
-; PTR32_IDX64-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
-; PTR32_IDX64-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX64-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
-; PTR32_IDX64-NEXT:    --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX64-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
-; PTR32_IDX64-NEXT:    --> (@global + %arg) U: [0,8589934591) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
-; PTR32_IDX64-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
-; PTR32_IDX64-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
-; PTR32_IDX64-NEXT:    %tmp18 = add i32 %tmp, 2
-; PTR32_IDX64-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
-; PTR32_IDX64-NEXT:  Determining loop execution counts for: @i64_to_i128
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
-; PTR32_IDX64-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
+; PTR16_IDX32-LABEL: 'v0_ptr_to_i128'
+; PTR16_IDX32-NEXT:  Classifying expressions for: @v0_ptr_to_i128
+; PTR16_IDX32-NEXT:    %tmp = phi i32 [ 0, %bb ], [ %tmp18, %bb17 ]
+; PTR16_IDX32-NEXT:    --> {0,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX32-NEXT:    %tmp12 = getelementptr i8, i8* %arg, i128 ptrtoint ([0 x i8]* @global to i128)
+; PTR16_IDX32-NEXT:    --> (@global + %arg) U: [0,131071) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX32-NEXT:    %tmp13 = bitcast i8* %tmp12 to i32*
+; PTR16_IDX32-NEXT:    --> (@global + %arg) U: [0,131071) S: full-set Exits: (@global + %arg) LoopDispositions: { %bb11: Invariant }
+; PTR16_IDX32-NEXT:    %tmp14 = load i32, i32* %tmp13, align 4
+; PTR16_IDX32-NEXT:    --> %tmp14 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb11: Variant }
+; PTR16_IDX32-NEXT:    %tmp18 = add i32 %tmp, 2
+; PTR16_IDX32-NEXT:    --> {2,+,2}<%bb11> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %bb11: Computable }
+; PTR16_IDX32-NEXT:  Determining loop execution counts for: @v0_ptr_to_i128
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable max backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb11: Unpredictable predicated backedge-taken count.
 ;
 bb:
   br label %bb11
@@ -237,3 +239,62 @@ bb17:                                             ; preds = %bb11
   %tmp18 = add i32 %tmp, 2
   br label %bb11
 }
+
+define void @v1_ptr_to_i32(i32 %arg, i32 %arg6) {
+; PTR64_IDX64-LABEL: 'v1_ptr_to_i32'
+; PTR64_IDX64-NEXT:  Classifying expressions for: @v1_ptr_to_i32
+; PTR64_IDX64-NEXT:    %tmp = sub i32 %arg, ptrtoint ([0 x i8]* @global to i32)
+; PTR64_IDX64-NEXT:    --> ((-1 * (trunc [0 x i8]* @global to i32)) + %arg) U: full-set S: full-set Exits: ((-1 * (trunc [0 x i8]* @global to i32)) + %arg) LoopDispositions: { %bb7: Invariant }
+; PTR64_IDX64-NEXT:    %tmp9 = select i1 %tmp8, i16 0, i16 1
+; PTR64_IDX64-NEXT:    --> %tmp9 U: [0,2) S: [-2,2) Exits: <<Unknown>> LoopDispositions: { %bb7: Variant }
+; PTR64_IDX64-NEXT:  Determining loop execution counts for: @v1_ptr_to_i32
+; PTR64_IDX64-NEXT:  Loop %bb7: Unpredictable backedge-taken count.
+; PTR64_IDX64-NEXT:  Loop %bb7: Unpredictable max backedge-taken count.
+; PTR64_IDX64-NEXT:  Loop %bb7: Unpredictable predicated backedge-taken count.
+;
+; PTR64_IDX32-LABEL: 'v1_ptr_to_i32'
+; PTR64_IDX32-NEXT:  Classifying expressions for: @v1_ptr_to_i32
+; PTR64_IDX32-NEXT:    %tmp = sub i32 %arg, ptrtoint ([0 x i8]* @global to i32)
+; PTR64_IDX32-NEXT:    --> ((-1 * @global) + %arg) U: full-set S: full-set Exits: ((-1 * @global) + %arg) LoopDispositions: { %bb7: Invariant }
+; PTR64_IDX32-NEXT:    %tmp9 = select i1 %tmp8, i16 0, i16 1
+; PTR64_IDX32-NEXT:    --> %tmp9 U: [0,2) S: [-2,2) Exits: <<Unknown>> LoopDispositions: { %bb7: Variant }
+; PTR64_IDX32-NEXT:  Determining loop execution counts for: @v1_ptr_to_i32
+; PTR64_IDX32-NEXT:  Loop %bb7: Unpredictable backedge-taken count.
+; PTR64_IDX32-NEXT:  Loop %bb7: Unpredictable max backedge-taken count.
+; PTR64_IDX32-NEXT:  Loop %bb7: Unpredictable predicated backedge-taken count.
+;
+; PTR16_IDX16-LABEL: 'v1_ptr_to_i32'
+; PTR16_IDX16-NEXT:  Classifying expressions for: @v1_ptr_to_i32
+; PTR16_IDX16-NEXT:    %tmp = sub i32 %arg, ptrtoint ([0 x i8]* @global to i32)
+; PTR16_IDX16-NEXT:    --> ((-1 * (zext [0 x i8]* @global to i32))<nsw> + %arg) U: full-set S: full-set Exits: ((-1 * (zext [0 x i8]* @global to i32))<nsw> + %arg) LoopDispositions: { %bb7: Invariant }
+; PTR16_IDX16-NEXT:    %tmp9 = select i1 %tmp8, i16 0, i16 1
+; PTR16_IDX16-NEXT:    --> %tmp9 U: [0,2) S: [-2,2) Exits: <<Unknown>> LoopDispositions: { %bb7: Variant }
+; PTR16_IDX16-NEXT:  Determining loop execution counts for: @v1_ptr_to_i32
+; PTR16_IDX16-NEXT:  Loop %bb7: Unpredictable backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb7: Unpredictable max backedge-taken count.
+; PTR16_IDX16-NEXT:  Loop %bb7: Unpredictable predicated backedge-taken count.
+;
+; PTR16_IDX32-LABEL: 'v1_ptr_to_i32'
+; PTR16_IDX32-NEXT:  Classifying expressions for: @v1_ptr_to_i32
+; PTR16_IDX32-NEXT:    %tmp = sub i32 %arg, ptrtoint ([0 x i8]* @global to i32)
+; PTR16_IDX32-NEXT:    --> ((-1 * @global) + %arg) U: full-set S: full-set Exits: ((-1 * @global) + %arg) LoopDispositions: { %bb7: Invariant }
+; PTR16_IDX32-NEXT:    %tmp9 = select i1 %tmp8, i16 0, i16 1
+; PTR16_IDX32-NEXT:    --> %tmp9 U: [0,2) S: [-2,2) Exits: <<Unknown>> LoopDispositions: { %bb7: Variant }
+; PTR16_IDX32-NEXT:  Determining loop execution counts for: @v1_ptr_to_i32
+; PTR16_IDX32-NEXT:  Loop %bb7: Unpredictable backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb7: Unpredictable max backedge-taken count.
+; PTR16_IDX32-NEXT:  Loop %bb7: Unpredictable predicated backedge-taken count.
+;
+bb:
+  br label %bb7
+
+bb7:                                              ; preds = %bb7, %bb
+  %tmp = sub i32 %arg, ptrtoint ([0 x i8]* @global to i32)
+  %tmp8 = icmp eq i32 %tmp, %arg6
+  %tmp9 = select i1 %tmp8, i16 0, i16 1
+  call void @use16(i16 %tmp9)
+  br i1 %tmp8, label %bb7, label %bb10
+
+bb10:                                             ; preds = %bb7
+  ret void
+}


        


More information about the llvm-commits mailing list