687 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt < %s --data-layout="e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X64 %s3; RUN: opt < %s --data-layout="e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128" -S -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck --check-prefixes=ALL,X32 %s4 5; While we can't treat inttoptr/ptrtoint casts as fully transparent,6; for ptrtoint cast, instead of modelling it as fully opaque (unknown),7; we can at least model it as zext/trunc/self of an unknown,8; iff it it's argument would be modelled as unknown anyways.9 10declare void @useptr(ptr)11 12; Simple ptrtoint of an argument, with casts to potentially different bit widths.13define void @ptrtoint(ptr %in, ptr %out0, ptr %out1, ptr %out2, ptr %out3) {14; X64-LABEL: 'ptrtoint'15; X64-NEXT: Classifying expressions for: @ptrtoint16; X64-NEXT: %p0 = ptrtoint ptr %in to i6417; X64-NEXT: --> (ptrtoint ptr %in to i64) U: full-set S: full-set18; X64-NEXT: %p1 = ptrtoint ptr %in to i3219; X64-NEXT: --> (trunc i64 (ptrtoint ptr %in to i64) to i32) U: full-set S: full-set20; X64-NEXT: %p2 = ptrtoint ptr %in to i1621; X64-NEXT: --> (trunc i64 (ptrtoint ptr %in to i64) to i16) U: full-set S: full-set22; X64-NEXT: %p3 = ptrtoint ptr %in to i12823; X64-NEXT: --> (zext i64 (ptrtoint ptr %in to i64) to i128) U: [0,18446744073709551616) S: [0,18446744073709551616)24; X64-NEXT: Determining loop execution counts for: @ptrtoint25;26; X32-LABEL: 'ptrtoint'27; X32-NEXT: Classifying expressions for: @ptrtoint28; X32-NEXT: %p0 = ptrtoint ptr %in to i6429; X32-NEXT: --> (zext i32 (ptrtoint ptr %in to i32) to i64) U: [0,4294967296) S: [0,4294967296)30; X32-NEXT: %p1 = ptrtoint ptr %in to i3231; X32-NEXT: --> (ptrtoint ptr %in to i32) U: full-set S: full-set32; X32-NEXT: %p2 = ptrtoint ptr %in to i1633; X32-NEXT: --> (trunc i32 (ptrtoint ptr %in to i32) to i16) U: full-set S: full-set34; X32-NEXT: %p3 = ptrtoint ptr %in to i12835; X32-NEXT: --> (zext i32 (ptrtoint ptr %in to i32) to i128) U: [0,4294967296) S: [0,4294967296)36; X32-NEXT: Determining loop execution counts for: @ptrtoint37;38 %p0 = ptrtoint ptr %in to i6439 %p1 = ptrtoint ptr %in to i3240 %p2 = ptrtoint ptr %in to i1641 %p3 = ptrtoint ptr %in to i12842 store i64 %p0, ptr %out043 store i32 %p1, ptr %out144 store i16 %p2, ptr %out245 store i128 %p3, ptr %out346 ret void47}48 49; Same, but from non-zero/non-default address space.50define void @ptrtoint_as1(ptr addrspace(1) %in, ptr %out0, ptr %out1, ptr %out2, ptr %out3) {51; X64-LABEL: 'ptrtoint_as1'52; X64-NEXT: Classifying expressions for: @ptrtoint_as153; X64-NEXT: %p0 = ptrtoint ptr addrspace(1) %in to i6454; X64-NEXT: --> (ptrtoint ptr addrspace(1) %in to i64) U: full-set S: full-set55; X64-NEXT: %p1 = ptrtoint ptr addrspace(1) %in to i3256; X64-NEXT: --> (trunc i64 (ptrtoint ptr addrspace(1) %in to i64) to i32) U: full-set S: full-set57; X64-NEXT: %p2 = ptrtoint ptr addrspace(1) %in to i1658; X64-NEXT: --> (trunc i64 (ptrtoint ptr addrspace(1) %in to i64) to i16) U: full-set S: full-set59; X64-NEXT: %p3 = ptrtoint ptr addrspace(1) %in to i12860; X64-NEXT: --> (zext i64 (ptrtoint ptr addrspace(1) %in to i64) to i128) U: [0,18446744073709551616) S: [0,18446744073709551616)61; X64-NEXT: Determining loop execution counts for: @ptrtoint_as162;63; X32-LABEL: 'ptrtoint_as1'64; X32-NEXT: Classifying expressions for: @ptrtoint_as165; X32-NEXT: %p0 = ptrtoint ptr addrspace(1) %in to i6466; X32-NEXT: --> (zext i32 (ptrtoint ptr addrspace(1) %in to i32) to i64) U: [0,4294967296) S: [0,4294967296)67; X32-NEXT: %p1 = ptrtoint ptr addrspace(1) %in to i3268; X32-NEXT: --> (ptrtoint ptr addrspace(1) %in to i32) U: full-set S: full-set69; X32-NEXT: %p2 = ptrtoint ptr addrspace(1) %in to i1670; X32-NEXT: --> (trunc i32 (ptrtoint ptr addrspace(1) %in to i32) to i16) U: full-set S: full-set71; X32-NEXT: %p3 = ptrtoint ptr addrspace(1) %in to i12872; X32-NEXT: --> (zext i32 (ptrtoint ptr addrspace(1) %in to i32) to i128) U: [0,4294967296) S: [0,4294967296)73; X32-NEXT: Determining loop execution counts for: @ptrtoint_as174;75 %p0 = ptrtoint ptr addrspace(1) %in to i6476 %p1 = ptrtoint ptr addrspace(1) %in to i3277 %p2 = ptrtoint ptr addrspace(1) %in to i1678 %p3 = ptrtoint ptr addrspace(1) %in to i12879 store i64 %p0, ptr %out080 store i32 %p1, ptr %out181 store i16 %p2, ptr %out282 store i128 %p3, ptr %out383 ret void84}85 86; Likewise, ptrtoint of a bitcast is fine, we simply skip it.87define void @ptrtoint_of_bitcast(ptr %in, ptr %out0) {88; X64-LABEL: 'ptrtoint_of_bitcast'89; X64-NEXT: Classifying expressions for: @ptrtoint_of_bitcast90; X64-NEXT: %in_casted = bitcast ptr %in to ptr91; X64-NEXT: --> %in U: full-set S: full-set92; X64-NEXT: %p0 = ptrtoint ptr %in_casted to i6493; X64-NEXT: --> (ptrtoint ptr %in to i64) U: full-set S: full-set94; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_bitcast95;96; X32-LABEL: 'ptrtoint_of_bitcast'97; X32-NEXT: Classifying expressions for: @ptrtoint_of_bitcast98; X32-NEXT: %in_casted = bitcast ptr %in to ptr99; X32-NEXT: --> %in U: full-set S: full-set100; X32-NEXT: %p0 = ptrtoint ptr %in_casted to i64101; X32-NEXT: --> (zext i32 (ptrtoint ptr %in to i32) to i64) U: [0,4294967296) S: [0,4294967296)102; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_bitcast103;104 %in_casted = bitcast ptr %in to ptr105 %p0 = ptrtoint ptr %in_casted to i64106 store i64 %p0, ptr %out0107 ret void108}109 110; addrspacecast is fine too, but We don't model addrspacecast, so we stop there.111define void @ptrtoint_of_addrspacecast(ptr %in, ptr %out0) {112; X64-LABEL: 'ptrtoint_of_addrspacecast'113; X64-NEXT: Classifying expressions for: @ptrtoint_of_addrspacecast114; X64-NEXT: %in_casted = addrspacecast ptr %in to ptr addrspace(1)115; X64-NEXT: --> %in_casted U: full-set S: full-set116; X64-NEXT: %p0 = ptrtoint ptr addrspace(1) %in_casted to i64117; X64-NEXT: --> (ptrtoint ptr addrspace(1) %in_casted to i64) U: full-set S: full-set118; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_addrspacecast119;120; X32-LABEL: 'ptrtoint_of_addrspacecast'121; X32-NEXT: Classifying expressions for: @ptrtoint_of_addrspacecast122; X32-NEXT: %in_casted = addrspacecast ptr %in to ptr addrspace(1)123; X32-NEXT: --> %in_casted U: full-set S: full-set124; X32-NEXT: %p0 = ptrtoint ptr addrspace(1) %in_casted to i64125; X32-NEXT: --> (zext i32 (ptrtoint ptr addrspace(1) %in_casted to i32) to i64) U: [0,4294967296) S: [0,4294967296)126; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_addrspacecast127;128 %in_casted = addrspacecast ptr %in to ptr addrspace(1)129 %p0 = ptrtoint ptr addrspace(1) %in_casted to i64130 store i64 %p0, ptr %out0131 ret void132}133 134; inttoptr is fine too, but we don't (and can't) model inttoptr, so we stop there.135define void @ptrtoint_of_inttoptr(i64 %in, ptr %out0) {136; X64-LABEL: 'ptrtoint_of_inttoptr'137; X64-NEXT: Classifying expressions for: @ptrtoint_of_inttoptr138; X64-NEXT: %in_casted = inttoptr i64 %in to ptr139; X64-NEXT: --> %in_casted U: full-set S: full-set140; X64-NEXT: %p0 = ptrtoint ptr %in_casted to i64141; X64-NEXT: --> (ptrtoint ptr %in_casted to i64) U: full-set S: full-set142; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_inttoptr143;144; X32-LABEL: 'ptrtoint_of_inttoptr'145; X32-NEXT: Classifying expressions for: @ptrtoint_of_inttoptr146; X32-NEXT: %in_casted = inttoptr i64 %in to ptr147; X32-NEXT: --> %in_casted U: full-set S: full-set148; X32-NEXT: %p0 = ptrtoint ptr %in_casted to i64149; X32-NEXT: --> (zext i32 (ptrtoint ptr %in_casted to i32) to i64) U: [0,4294967296) S: [0,4294967296)150; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_inttoptr151;152 %in_casted = inttoptr i64 %in to ptr153 %p0 = ptrtoint ptr %in_casted to i64154 store i64 %p0, ptr %out0155 ret void156}157 158; A constant pointer is fine159define void @ptrtoint_of_nullptr(ptr %out0) {160; ALL-LABEL: 'ptrtoint_of_nullptr'161; ALL-NEXT: Classifying expressions for: @ptrtoint_of_nullptr162; ALL-NEXT: %p0 = ptrtoint ptr null to i64163; ALL-NEXT: --> 0 U: [0,1) S: [0,1)164; ALL-NEXT: Determining loop execution counts for: @ptrtoint_of_nullptr165;166 %p0 = ptrtoint ptr null to i64167 store i64 %p0, ptr %out0168 ret void169}170 171; A constant inttoptr argument of an ptrtoint is still bad.172define void @ptrtoint_of_constantexpr_inttoptr(ptr %out0) {173; X64-LABEL: 'ptrtoint_of_constantexpr_inttoptr'174; X64-NEXT: Classifying expressions for: @ptrtoint_of_constantexpr_inttoptr175; X64-NEXT: %p0 = ptrtoint ptr inttoptr (i64 42 to ptr) to i64176; X64-NEXT: --> (ptrtoint ptr inttoptr (i64 42 to ptr) to i64) U: [42,43) S: [42,43)177; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_constantexpr_inttoptr178;179; X32-LABEL: 'ptrtoint_of_constantexpr_inttoptr'180; X32-NEXT: Classifying expressions for: @ptrtoint_of_constantexpr_inttoptr181; X32-NEXT: %p0 = ptrtoint ptr inttoptr (i64 42 to ptr) to i64182; X32-NEXT: --> (zext i32 (ptrtoint ptr inttoptr (i64 42 to ptr) to i32) to i64) U: [42,43) S: [42,43)183; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_constantexpr_inttoptr184;185 %p0 = ptrtoint ptr inttoptr (i64 42 to ptr) to i64186 store i64 %p0, ptr %out0187 ret void188}189 190; ptrtoint of GEP is fine.191define void @ptrtoint_of_gep(ptr %in, ptr %out0) {192; X64-LABEL: 'ptrtoint_of_gep'193; X64-NEXT: Classifying expressions for: @ptrtoint_of_gep194; X64-NEXT: %in_adj = getelementptr inbounds i8, ptr %in, i64 42195; X64-NEXT: --> (42 + %in) U: full-set S: full-set196; X64-NEXT: %p0 = ptrtoint ptr %in_adj to i64197; X64-NEXT: --> (42 + (ptrtoint ptr %in to i64)) U: full-set S: full-set198; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_gep199;200; X32-LABEL: 'ptrtoint_of_gep'201; X32-NEXT: Classifying expressions for: @ptrtoint_of_gep202; X32-NEXT: %in_adj = getelementptr inbounds i8, ptr %in, i64 42203; X32-NEXT: --> (42 + %in) U: full-set S: full-set204; X32-NEXT: %p0 = ptrtoint ptr %in_adj to i64205; X32-NEXT: --> (zext i32 (42 + (ptrtoint ptr %in to i32)) to i64) U: [0,4294967296) S: [0,4294967296)206; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_gep207;208 %in_adj = getelementptr inbounds i8, ptr %in, i64 42209 %p0 = ptrtoint ptr %in_adj to i64210 store i64 %p0, ptr %out0211 ret void212}213 214; It seems, we can't get ptrtoint of mul/udiv, or at least it's hard to come up with a test case.215 216; ptrtoint of AddRec217define void @ptrtoint_of_addrec(ptr %in, i32 %count) {218; X64-LABEL: 'ptrtoint_of_addrec'219; X64-NEXT: Classifying expressions for: @ptrtoint_of_addrec220; X64-NEXT: %i3 = zext i32 %count to i64221; X64-NEXT: --> (zext i32 %count to i64) U: [0,4294967296) S: [0,4294967296)222; X64-NEXT: %i6 = phi i64 [ 0, %entry ], [ %i9, %loop ]223; X64-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: (-1 + (zext i32 %count to i64))<nsw> LoopDispositions: { %loop: Computable }224; X64-NEXT: %i7 = getelementptr inbounds i32, ptr %in, i64 %i6225; X64-NEXT: --> {%in,+,4}<%loop> U: full-set S: full-set Exits: (-4 + (4 * (zext i32 %count to i64))<nuw><nsw> + %in) LoopDispositions: { %loop: Computable }226; X64-NEXT: %i8 = ptrtoint ptr %i7 to i64227; X64-NEXT: --> {(ptrtoint ptr %in to i64),+,4}<%loop> U: full-set S: full-set Exits: (-4 + (4 * (zext i32 %count to i64))<nuw><nsw> + (ptrtoint ptr %in to i64)) LoopDispositions: { %loop: Computable }228; X64-NEXT: %i9 = add nuw nsw i64 %i6, 1229; X64-NEXT: --> {1,+,1}<nuw><%loop> U: [1,0) S: [1,0) Exits: (zext i32 %count to i64) LoopDispositions: { %loop: Computable }230; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_addrec231; X64-NEXT: Loop %loop: backedge-taken count is (-1 + (zext i32 %count to i64))<nsw>232; X64-NEXT: Loop %loop: constant max backedge-taken count is i64 -1233; X64-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (zext i32 %count to i64))<nsw>234; X64-NEXT: Loop %loop: Trip multiple is 1235;236; X32-LABEL: 'ptrtoint_of_addrec'237; X32-NEXT: Classifying expressions for: @ptrtoint_of_addrec238; X32-NEXT: %i3 = zext i32 %count to i64239; X32-NEXT: --> (zext i32 %count to i64) U: [0,4294967296) S: [0,4294967296)240; X32-NEXT: %i6 = phi i64 [ 0, %entry ], [ %i9, %loop ]241; X32-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: (-1 + (zext i32 %count to i64))<nsw> LoopDispositions: { %loop: Computable }242; X32-NEXT: %i7 = getelementptr inbounds i32, ptr %in, i64 %i6243; X32-NEXT: --> {%in,+,4}<%loop> U: full-set S: full-set Exits: (-4 + (4 * %count) + %in) LoopDispositions: { %loop: Computable }244; X32-NEXT: %i8 = ptrtoint ptr %i7 to i64245; X32-NEXT: --> (zext i32 {(ptrtoint ptr %in to i32),+,4}<%loop> to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 (-4 + (4 * %count) + (ptrtoint ptr %in to i32)) to i64) LoopDispositions: { %loop: Computable }246; X32-NEXT: %i9 = add nuw nsw i64 %i6, 1247; X32-NEXT: --> {1,+,1}<nuw><%loop> U: [1,0) S: [1,0) Exits: (zext i32 %count to i64) LoopDispositions: { %loop: Computable }248; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_addrec249; X32-NEXT: Loop %loop: backedge-taken count is (-1 + (zext i32 %count to i64))<nsw>250; X32-NEXT: Loop %loop: constant max backedge-taken count is i64 -1251; X32-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (zext i32 %count to i64))<nsw>252; X32-NEXT: Loop %loop: Trip multiple is 1253;254entry:255 %i3 = zext i32 %count to i64256 br label %loop257 258loop:259 %i6 = phi i64 [ 0, %entry ], [ %i9, %loop ]260 %i7 = getelementptr inbounds i32, ptr %in, i64 %i6261 %i8 = ptrtoint ptr %i7 to i64262 tail call void @use(i64 %i8)263 %i9 = add nuw nsw i64 %i6, 1264 %i10 = icmp eq i64 %i9, %i3265 br i1 %i10, label %end, label %loop266 267end:268 ret void269}270declare void @use(i64)271 272; ptrtoint of UMax273define void @ptrtoint_of_umax(ptr %in0, ptr %in1, ptr %out0) {274; X64-LABEL: 'ptrtoint_of_umax'275; X64-NEXT: Classifying expressions for: @ptrtoint_of_umax276; X64-NEXT: %s = select i1 %c, ptr %in0, ptr %in1277; X64-NEXT: --> (%in0 umax %in1) U: full-set S: full-set278; X64-NEXT: %p0 = ptrtoint ptr %s to i64279; X64-NEXT: --> ((ptrtoint ptr %in0 to i64) umax (ptrtoint ptr %in1 to i64)) U: full-set S: full-set280; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_umax281;282; X32-LABEL: 'ptrtoint_of_umax'283; X32-NEXT: Classifying expressions for: @ptrtoint_of_umax284; X32-NEXT: %s = select i1 %c, ptr %in0, ptr %in1285; X32-NEXT: --> (%in0 umax %in1) U: full-set S: full-set286; X32-NEXT: %p0 = ptrtoint ptr %s to i64287; X32-NEXT: --> ((zext i32 (ptrtoint ptr %in0 to i32) to i64) umax (zext i32 (ptrtoint ptr %in1 to i32) to i64)) U: [0,4294967296) S: [0,4294967296)288; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_umax289;290 %c = icmp uge ptr %in0, %in1291 %s = select i1 %c, ptr %in0, ptr %in1292 %p0 = ptrtoint ptr %s to i64293 store i64 %p0, ptr %out0294 ret void295}296; ptrtoint of SMax297define void @ptrtoint_of_smax(ptr %in0, ptr %in1, ptr %out0) {298; X64-LABEL: 'ptrtoint_of_smax'299; X64-NEXT: Classifying expressions for: @ptrtoint_of_smax300; X64-NEXT: %s = select i1 %c, ptr %in0, ptr %in1301; X64-NEXT: --> (%in0 smax %in1) U: full-set S: full-set302; X64-NEXT: %p0 = ptrtoint ptr %s to i64303; X64-NEXT: --> ((ptrtoint ptr %in0 to i64) smax (ptrtoint ptr %in1 to i64)) U: full-set S: full-set304; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_smax305;306; X32-LABEL: 'ptrtoint_of_smax'307; X32-NEXT: Classifying expressions for: @ptrtoint_of_smax308; X32-NEXT: %s = select i1 %c, ptr %in0, ptr %in1309; X32-NEXT: --> (%in0 smax %in1) U: full-set S: full-set310; X32-NEXT: %p0 = ptrtoint ptr %s to i64311; X32-NEXT: --> (zext i32 ((ptrtoint ptr %in0 to i32) smax (ptrtoint ptr %in1 to i32)) to i64) U: [0,4294967296) S: [0,4294967296)312; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_smax313;314 %c = icmp sge ptr %in0, %in1315 %s = select i1 %c, ptr %in0, ptr %in1316 %p0 = ptrtoint ptr %s to i64317 store i64 %p0, ptr %out0318 ret void319}320; ptrtoint of UMin321define void @ptrtoint_of_umin(ptr %in0, ptr %in1, ptr %out0) {322; X64-LABEL: 'ptrtoint_of_umin'323; X64-NEXT: Classifying expressions for: @ptrtoint_of_umin324; X64-NEXT: %s = select i1 %c, ptr %in0, ptr %in1325; X64-NEXT: --> (%in0 umin %in1) U: full-set S: full-set326; X64-NEXT: %p0 = ptrtoint ptr %s to i64327; X64-NEXT: --> ((ptrtoint ptr %in0 to i64) umin (ptrtoint ptr %in1 to i64)) U: full-set S: full-set328; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_umin329;330; X32-LABEL: 'ptrtoint_of_umin'331; X32-NEXT: Classifying expressions for: @ptrtoint_of_umin332; X32-NEXT: %s = select i1 %c, ptr %in0, ptr %in1333; X32-NEXT: --> (%in0 umin %in1) U: full-set S: full-set334; X32-NEXT: %p0 = ptrtoint ptr %s to i64335; X32-NEXT: --> ((zext i32 (ptrtoint ptr %in0 to i32) to i64) umin (zext i32 (ptrtoint ptr %in1 to i32) to i64)) U: [0,4294967296) S: [0,4294967296)336; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_umin337;338 %c = icmp ule ptr %in0, %in1339 %s = select i1 %c, ptr %in0, ptr %in1340 %p0 = ptrtoint ptr %s to i64341 store i64 %p0, ptr %out0342 ret void343}344; ptrtoint of SMin345define void @ptrtoint_of_smin(ptr %in0, ptr %in1, ptr %out0) {346; X64-LABEL: 'ptrtoint_of_smin'347; X64-NEXT: Classifying expressions for: @ptrtoint_of_smin348; X64-NEXT: %s = select i1 %c, ptr %in0, ptr %in1349; X64-NEXT: --> (%in0 smin %in1) U: full-set S: full-set350; X64-NEXT: %p0 = ptrtoint ptr %s to i64351; X64-NEXT: --> ((ptrtoint ptr %in0 to i64) smin (ptrtoint ptr %in1 to i64)) U: full-set S: full-set352; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_smin353;354; X32-LABEL: 'ptrtoint_of_smin'355; X32-NEXT: Classifying expressions for: @ptrtoint_of_smin356; X32-NEXT: %s = select i1 %c, ptr %in0, ptr %in1357; X32-NEXT: --> (%in0 smin %in1) U: full-set S: full-set358; X32-NEXT: %p0 = ptrtoint ptr %s to i64359; X32-NEXT: --> (zext i32 ((ptrtoint ptr %in0 to i32) smin (ptrtoint ptr %in1 to i32)) to i64) U: [0,4294967296) S: [0,4294967296)360; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_smin361;362 %c = icmp sle ptr %in0, %in1363 %s = select i1 %c, ptr %in0, ptr %in1364 %p0 = ptrtoint ptr %s to i64365 store i64 %p0, ptr %out0366 ret void367}368 369; void pr46786_c26_char(char* start, char *end, char *other) {370; for (char* cur = start; cur != end; ++cur)371; other[cur - start] += *cur;372; }373define void @pr46786_c26_char(ptr %arg, ptr %arg1, ptr %arg2) {374; X64-LABEL: 'pr46786_c26_char'375; X64-NEXT: Classifying expressions for: @pr46786_c26_char376; X64-NEXT: %i4 = ptrtoint ptr %arg to i64377; X64-NEXT: --> (ptrtoint ptr %arg to i64) U: full-set S: full-set378; X64-NEXT: %i7 = phi ptr [ %arg, %bb3 ], [ %i14, %bb6 ]379; X64-NEXT: --> {%arg,+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64) + %arg) LoopDispositions: { %bb6: Computable }380; X64-NEXT: %i8 = load i8, ptr %i7, align 1381; X64-NEXT: --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }382; X64-NEXT: %i9 = ptrtoint ptr %i7 to i64383; X64-NEXT: --> {(ptrtoint ptr %arg to i64),+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + (ptrtoint ptr %arg1 to i64)) LoopDispositions: { %bb6: Computable }384; X64-NEXT: %i10 = sub i64 %i9, %i4385; X64-NEXT: --> {0,+,1}<nuw><%bb6> U: [0,-1) S: [0,-1) Exits: (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) LoopDispositions: { %bb6: Computable }386; X64-NEXT: %i11 = getelementptr inbounds i8, ptr %arg2, i64 %i10387; X64-NEXT: --> {%arg2,+,1}<nw><%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64) + %arg2) LoopDispositions: { %bb6: Computable }388; X64-NEXT: %i12 = load i8, ptr %i11, align 1389; X64-NEXT: --> %i12 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }390; X64-NEXT: %i13 = add i8 %i12, %i8391; X64-NEXT: --> (%i12 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }392; X64-NEXT: %i14 = getelementptr inbounds i8, ptr %i7, i64 1393; X64-NEXT: --> {(1 + %arg),+,1}<nuw><%bb6> U: full-set S: full-set Exits: ((-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64) + %arg) LoopDispositions: { %bb6: Computable }394; X64-NEXT: Determining loop execution counts for: @pr46786_c26_char395; X64-NEXT: Loop %bb6: backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64))396; X64-NEXT: Loop %bb6: constant max backedge-taken count is i64 -2397; X64-NEXT: Loop %bb6: symbolic max backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64))398; X64-NEXT: Loop %bb6: Trip multiple is 1399;400; X32-LABEL: 'pr46786_c26_char'401; X32-NEXT: Classifying expressions for: @pr46786_c26_char402; X32-NEXT: %i4 = ptrtoint ptr %arg to i64403; X32-NEXT: --> (zext i32 (ptrtoint ptr %arg to i32) to i64) U: [0,4294967296) S: [0,4294967296)404; X32-NEXT: %i7 = phi ptr [ %arg, %bb3 ], [ %i14, %bb6 ]405; X32-NEXT: --> {%arg,+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32) + %arg) LoopDispositions: { %bb6: Computable }406; X32-NEXT: %i8 = load i8, ptr %i7, align 1407; X32-NEXT: --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }408; X32-NEXT: %i9 = ptrtoint ptr %i7 to i64409; X32-NEXT: --> {(zext i32 (ptrtoint ptr %arg to i32) to i64),+,1}<nuw><%bb6> U: [0,8589934590) S: [0,8589934590) Exits: ((zext i32 (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) to i64) + (zext i32 (ptrtoint ptr %arg to i32) to i64)) LoopDispositions: { %bb6: Computable }410; X32-NEXT: %i10 = sub i64 %i9, %i4411; X32-NEXT: --> {0,+,1}<nuw><%bb6> U: [0,4294967295) S: [0,4294967295) Exits: (zext i32 (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) to i64) LoopDispositions: { %bb6: Computable }412; X32-NEXT: %i11 = getelementptr inbounds i8, ptr %arg2, i64 %i10413; X32-NEXT: --> {%arg2,+,1}<%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32) + %arg2) LoopDispositions: { %bb6: Computable }414; X32-NEXT: %i12 = load i8, ptr %i11, align 1415; X32-NEXT: --> %i12 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }416; X32-NEXT: %i13 = add i8 %i12, %i8417; X32-NEXT: --> (%i12 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }418; X32-NEXT: %i14 = getelementptr inbounds i8, ptr %i7, i64 1419; X32-NEXT: --> {(1 + %arg),+,1}<nuw><%bb6> U: full-set S: full-set Exits: ((-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32) + %arg) LoopDispositions: { %bb6: Computable }420; X32-NEXT: Determining loop execution counts for: @pr46786_c26_char421; X32-NEXT: Loop %bb6: backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32))422; X32-NEXT: Loop %bb6: constant max backedge-taken count is i32 -2423; X32-NEXT: Loop %bb6: symbolic max backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32))424; X32-NEXT: Loop %bb6: Trip multiple is 1425;426 %i = icmp eq ptr %arg, %arg1427 br i1 %i, label %bb5, label %bb3428 429bb3:430 %i4 = ptrtoint ptr %arg to i64431 br label %bb6432 433bb6:434 %i7 = phi ptr [ %arg, %bb3 ], [ %i14, %bb6 ]435 %i8 = load i8, ptr %i7436 %i9 = ptrtoint ptr %i7 to i64437 %i10 = sub i64 %i9, %i4438 %i11 = getelementptr inbounds i8, ptr %arg2, i64 %i10439 %i12 = load i8, ptr %i11440 %i13 = add i8 %i12, %i8441 store i8 %i13, ptr %i11442 %i14 = getelementptr inbounds i8, ptr %i7, i64 1443 %i15 = icmp eq ptr %i14, %arg1444 br i1 %i15, label %bb5, label %bb6445 446bb5:447 ret void448}449 450define void @pr46786_c26_char_cmp_ops_swapped(ptr %arg, ptr %arg1, ptr %arg2) {451; X64-LABEL: 'pr46786_c26_char_cmp_ops_swapped'452; X64-NEXT: Classifying expressions for: @pr46786_c26_char_cmp_ops_swapped453; X64-NEXT: %i4 = ptrtoint ptr %arg to i64454; X64-NEXT: --> (ptrtoint ptr %arg to i64) U: full-set S: full-set455; X64-NEXT: %i7 = phi ptr [ %arg, %bb3 ], [ %i14, %bb6 ]456; X64-NEXT: --> {%arg,+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64) + %arg) LoopDispositions: { %bb6: Computable }457; X64-NEXT: %i8 = load i8, ptr %i7, align 1458; X64-NEXT: --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }459; X64-NEXT: %i9 = ptrtoint ptr %i7 to i64460; X64-NEXT: --> {(ptrtoint ptr %arg to i64),+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + (ptrtoint ptr %arg1 to i64)) LoopDispositions: { %bb6: Computable }461; X64-NEXT: %i10 = sub i64 %i9, %i4462; X64-NEXT: --> {0,+,1}<nuw><%bb6> U: [0,-1) S: [0,-1) Exits: (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) LoopDispositions: { %bb6: Computable }463; X64-NEXT: %i11 = getelementptr inbounds i8, ptr %arg2, i64 %i10464; X64-NEXT: --> {%arg2,+,1}<nw><%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64) + %arg2) LoopDispositions: { %bb6: Computable }465; X64-NEXT: %i12 = load i8, ptr %i11, align 1466; X64-NEXT: --> %i12 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }467; X64-NEXT: %i13 = add i8 %i12, %i8468; X64-NEXT: --> (%i12 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }469; X64-NEXT: %i14 = getelementptr inbounds i8, ptr %i7, i64 1470; X64-NEXT: --> {(1 + %arg),+,1}<nuw><%bb6> U: full-set S: full-set Exits: ((-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64) + %arg) LoopDispositions: { %bb6: Computable }471; X64-NEXT: Determining loop execution counts for: @pr46786_c26_char_cmp_ops_swapped472; X64-NEXT: Loop %bb6: backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64))473; X64-NEXT: Loop %bb6: constant max backedge-taken count is i64 -2474; X64-NEXT: Loop %bb6: symbolic max backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64))475; X64-NEXT: Loop %bb6: Trip multiple is 1476;477; X32-LABEL: 'pr46786_c26_char_cmp_ops_swapped'478; X32-NEXT: Classifying expressions for: @pr46786_c26_char_cmp_ops_swapped479; X32-NEXT: %i4 = ptrtoint ptr %arg to i64480; X32-NEXT: --> (zext i32 (ptrtoint ptr %arg to i32) to i64) U: [0,4294967296) S: [0,4294967296)481; X32-NEXT: %i7 = phi ptr [ %arg, %bb3 ], [ %i14, %bb6 ]482; X32-NEXT: --> {%arg,+,1}<nuw><%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32) + %arg) LoopDispositions: { %bb6: Computable }483; X32-NEXT: %i8 = load i8, ptr %i7, align 1484; X32-NEXT: --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }485; X32-NEXT: %i9 = ptrtoint ptr %i7 to i64486; X32-NEXT: --> {(zext i32 (ptrtoint ptr %arg to i32) to i64),+,1}<nuw><%bb6> U: [0,8589934590) S: [0,8589934590) Exits: ((zext i32 (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) to i64) + (zext i32 (ptrtoint ptr %arg to i32) to i64)) LoopDispositions: { %bb6: Computable }487; X32-NEXT: %i10 = sub i64 %i9, %i4488; X32-NEXT: --> {0,+,1}<nuw><%bb6> U: [0,4294967295) S: [0,4294967295) Exits: (zext i32 (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) to i64) LoopDispositions: { %bb6: Computable }489; X32-NEXT: %i11 = getelementptr inbounds i8, ptr %arg2, i64 %i10490; X32-NEXT: --> {%arg2,+,1}<%bb6> U: full-set S: full-set Exits: (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32) + %arg2) LoopDispositions: { %bb6: Computable }491; X32-NEXT: %i12 = load i8, ptr %i11, align 1492; X32-NEXT: --> %i12 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }493; X32-NEXT: %i13 = add i8 %i12, %i8494; X32-NEXT: --> (%i12 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }495; X32-NEXT: %i14 = getelementptr inbounds i8, ptr %i7, i64 1496; X32-NEXT: --> {(1 + %arg),+,1}<nuw><%bb6> U: full-set S: full-set Exits: ((-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32) + %arg) LoopDispositions: { %bb6: Computable }497; X32-NEXT: Determining loop execution counts for: @pr46786_c26_char_cmp_ops_swapped498; X32-NEXT: Loop %bb6: backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32))499; X32-NEXT: Loop %bb6: constant max backedge-taken count is i32 -2500; X32-NEXT: Loop %bb6: symbolic max backedge-taken count is (-1 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32))501; X32-NEXT: Loop %bb6: Trip multiple is 1502;503 %i = icmp eq ptr %arg1, %arg504 br i1 %i, label %bb5, label %bb3505 506bb3:507 %i4 = ptrtoint ptr %arg to i64508 br label %bb6509 510bb6:511 %i7 = phi ptr [ %arg, %bb3 ], [ %i14, %bb6 ]512 %i8 = load i8, ptr %i7513 %i9 = ptrtoint ptr %i7 to i64514 %i10 = sub i64 %i9, %i4515 %i11 = getelementptr inbounds i8, ptr %arg2, i64 %i10516 %i12 = load i8, ptr %i11517 %i13 = add i8 %i12, %i8518 store i8 %i13, ptr %i11519 %i14 = getelementptr inbounds i8, ptr %i7, i64 1520 %i15 = icmp eq ptr %i14, %arg1521 br i1 %i15, label %bb5, label %bb6522 523bb5:524 ret void525}526 527 528; void pr46786_c26_int(int* start, int *end, int *other) {529; for (int* cur = start; cur != end; ++cur)530; other[cur - start] += *cur;531; }532;533; FIXME: 4 * (%i10 EXACT/s 4) is just %i10534define void @pr46786_c26_int(ptr %arg, ptr %arg1, ptr %arg2) {535; X64-LABEL: 'pr46786_c26_int'536; X64-NEXT: Classifying expressions for: @pr46786_c26_int537; X64-NEXT: %i4 = ptrtoint ptr %arg to i64538; X64-NEXT: --> (ptrtoint ptr %arg to i64) U: full-set S: full-set539; X64-NEXT: %i7 = phi ptr [ %arg, %bb3 ], [ %i15, %bb6 ]540; X64-NEXT: --> {%arg,+,4}<nuw><%bb6> U: full-set S: full-set Exits: ((4 * ((-4 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }541; X64-NEXT: %i8 = load i32, ptr %i7, align 4542; X64-NEXT: --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }543; X64-NEXT: %i9 = ptrtoint ptr %i7 to i64544; X64-NEXT: --> {(ptrtoint ptr %arg to i64),+,4}<nuw><%bb6> U: full-set S: full-set Exits: ((4 * ((-4 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) /u 4))<nuw> + (ptrtoint ptr %arg to i64)) LoopDispositions: { %bb6: Computable }545; X64-NEXT: %i10 = sub i64 %i9, %i4546; X64-NEXT: --> {0,+,4}<nuw><%bb6> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: (4 * ((-4 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) /u 4))<nuw> LoopDispositions: { %bb6: Computable }547; X64-NEXT: %i11 = ashr exact i64 %i10, 2548; X64-NEXT: --> %i11 U: [-2305843009213693952,2305843009213693952) S: [-2305843009213693952,2305843009213693952) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }549; X64-NEXT: %i12 = getelementptr inbounds i32, ptr %arg2, i64 %i11550; X64-NEXT: --> ((4 * %i11)<nsw> + %arg2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }551; X64-NEXT: %i13 = load i32, ptr %i12, align 4552; X64-NEXT: --> %i13 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }553; X64-NEXT: %i14 = add nsw i32 %i13, %i8554; X64-NEXT: --> (%i13 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }555; X64-NEXT: %i15 = getelementptr inbounds i32, ptr %i7, i64 1556; X64-NEXT: --> {(4 + %arg),+,4}<nuw><%bb6> U: full-set S: full-set Exits: (4 + (4 * ((-4 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }557; X64-NEXT: Determining loop execution counts for: @pr46786_c26_int558; X64-NEXT: Loop %bb6: backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) /u 4)559; X64-NEXT: Loop %bb6: constant max backedge-taken count is i64 4611686018427387903560; X64-NEXT: Loop %bb6: symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %arg to i64)) + (ptrtoint ptr %arg1 to i64)) /u 4)561; X64-NEXT: Loop %bb6: Trip multiple is 1562;563; X32-LABEL: 'pr46786_c26_int'564; X32-NEXT: Classifying expressions for: @pr46786_c26_int565; X32-NEXT: %i4 = ptrtoint ptr %arg to i64566; X32-NEXT: --> (zext i32 (ptrtoint ptr %arg to i32) to i64) U: [0,4294967296) S: [0,4294967296)567; X32-NEXT: %i7 = phi ptr [ %arg, %bb3 ], [ %i15, %bb6 ]568; X32-NEXT: --> {%arg,+,4}<nuw><%bb6> U: full-set S: full-set Exits: ((4 * ((-4 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }569; X32-NEXT: %i8 = load i32, ptr %i7, align 4570; X32-NEXT: --> %i8 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }571; X32-NEXT: %i9 = ptrtoint ptr %i7 to i64572; X32-NEXT: --> {(zext i32 (ptrtoint ptr %arg to i32) to i64),+,4}<nuw><%bb6> U: [0,8589934588) S: [0,8589934588) Exits: ((zext i32 (ptrtoint ptr %arg to i32) to i64) + (4 * ((zext i32 (-4 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) to i64) /u 4))<nuw><nsw>) LoopDispositions: { %bb6: Computable }573; X32-NEXT: %i10 = sub i64 %i9, %i4574; X32-NEXT: --> {0,+,4}<nuw><%bb6> U: [0,4294967293) S: [0,4294967293) Exits: (4 * ((zext i32 (-4 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) to i64) /u 4))<nuw><nsw> LoopDispositions: { %bb6: Computable }575; X32-NEXT: %i11 = ashr exact i64 %i10, 2576; X32-NEXT: --> %i11 U: [-2147483648,2147483648) S: [-2147483648,2147483648) Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }577; X32-NEXT: %i12 = getelementptr inbounds i32, ptr %arg2, i64 %i11578; X32-NEXT: --> ((4 * (trunc i64 %i11 to i32))<nsw> + %arg2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }579; X32-NEXT: %i13 = load i32, ptr %i12, align 4580; X32-NEXT: --> %i13 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }581; X32-NEXT: %i14 = add nsw i32 %i13, %i8582; X32-NEXT: --> (%i13 + %i8) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb6: Variant }583; X32-NEXT: %i15 = getelementptr inbounds i32, ptr %i7, i64 1584; X32-NEXT: --> {(4 + %arg),+,4}<nuw><%bb6> U: full-set S: full-set Exits: (4 + (4 * ((-4 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) /u 4))<nuw> + %arg) LoopDispositions: { %bb6: Computable }585; X32-NEXT: Determining loop execution counts for: @pr46786_c26_int586; X32-NEXT: Loop %bb6: backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) /u 4)587; X32-NEXT: Loop %bb6: constant max backedge-taken count is i32 1073741823588; X32-NEXT: Loop %bb6: symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %arg to i32)) + (ptrtoint ptr %arg1 to i32)) /u 4)589; X32-NEXT: Loop %bb6: Trip multiple is 1590;591 %i = icmp eq ptr %arg, %arg1592 br i1 %i, label %bb5, label %bb3593 594bb3:595 %i4 = ptrtoint ptr %arg to i64596 br label %bb6597 598bb6:599 %i7 = phi ptr [ %arg, %bb3 ], [ %i15, %bb6 ]600 %i8 = load i32, ptr %i7601 %i9 = ptrtoint ptr %i7 to i64602 %i10 = sub i64 %i9, %i4603 %i11 = ashr exact i64 %i10, 2604 %i12 = getelementptr inbounds i32, ptr %arg2, i64 %i11605 %i13 = load i32, ptr %i12606 %i14 = add nsw i32 %i13, %i8607 store i32 %i14, ptr %i12608 %i15 = getelementptr inbounds i32, ptr %i7, i64 1609 %i16 = icmp eq ptr %i15, %arg1610 br i1 %i16, label %bb5, label %bb6611 612bb5:613 ret void614}615 616; During SCEV rewrites, we could end up calling `ScalarEvolution::getPtrToIntExpr()`617; on an integer. Make sure we handle that case gracefully.618define void @ptrtoint_of_integer(ptr %arg, i64 %arg1, i1 %arg2) local_unnamed_addr {619; X64-LABEL: 'ptrtoint_of_integer'620; X64-NEXT: Classifying expressions for: @ptrtoint_of_integer621; X64-NEXT: %i4 = ptrtoint ptr %arg to i64622; X64-NEXT: --> (ptrtoint ptr %arg to i64) U: full-set S: full-set623; X64-NEXT: %i6 = sub i64 %i4, %arg1624; X64-NEXT: --> ((-1 * %arg1) + (ptrtoint ptr %arg to i64)) U: full-set S: full-set625; X64-NEXT: %i9 = phi i64 [ 1, %bb7 ], [ %i11, %bb10 ]626; X64-NEXT: --> {1,+,1}<nuw><%bb8> U: [1,0) S: [1,0) Exits: <<Unknown>> LoopDispositions: { %bb8: Computable }627; X64-NEXT: %i11 = add nuw i64 %i9, 1628; X64-NEXT: --> {2,+,1}<nw><%bb8> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb8: Computable }629; X64-NEXT: Determining loop execution counts for: @ptrtoint_of_integer630; X64-NEXT: Loop %bb8: <multiple exits> Unpredictable backedge-taken count.631; X64-NEXT: exit count for bb8: ***COULDNOTCOMPUTE***632; X64-NEXT: exit count for bb10: (-2 + (-1 * %arg1) + (ptrtoint ptr %arg to i64))633; X64-NEXT: Loop %bb8: constant max backedge-taken count is i64 -1634; X64-NEXT: Loop %bb8: symbolic max backedge-taken count is (-2 + (-1 * %arg1) + (ptrtoint ptr %arg to i64))635; X64-NEXT: symbolic max exit count for bb8: ***COULDNOTCOMPUTE***636; X64-NEXT: symbolic max exit count for bb10: (-2 + (-1 * %arg1) + (ptrtoint ptr %arg to i64))637;638; X32-LABEL: 'ptrtoint_of_integer'639; X32-NEXT: Classifying expressions for: @ptrtoint_of_integer640; X32-NEXT: %i4 = ptrtoint ptr %arg to i64641; X32-NEXT: --> (zext i32 (ptrtoint ptr %arg to i32) to i64) U: [0,4294967296) S: [0,4294967296)642; X32-NEXT: %i6 = sub i64 %i4, %arg1643; X32-NEXT: --> ((zext i32 (ptrtoint ptr %arg to i32) to i64) + (-1 * %arg1)) U: full-set S: full-set644; X32-NEXT: %i9 = phi i64 [ 1, %bb7 ], [ %i11, %bb10 ]645; X32-NEXT: --> {1,+,1}<nuw><%bb8> U: [1,0) S: [1,0) Exits: <<Unknown>> LoopDispositions: { %bb8: Computable }646; X32-NEXT: %i11 = add nuw i64 %i9, 1647; X32-NEXT: --> {2,+,1}<nw><%bb8> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb8: Computable }648; X32-NEXT: Determining loop execution counts for: @ptrtoint_of_integer649; X32-NEXT: Loop %bb8: <multiple exits> Unpredictable backedge-taken count.650; X32-NEXT: exit count for bb8: ***COULDNOTCOMPUTE***651; X32-NEXT: exit count for bb10: (-2 + (zext i32 (ptrtoint ptr %arg to i32) to i64) + (-1 * %arg1))652; X32-NEXT: Loop %bb8: constant max backedge-taken count is i64 -1653; X32-NEXT: Loop %bb8: symbolic max backedge-taken count is (-2 + (zext i32 (ptrtoint ptr %arg to i32) to i64) + (-1 * %arg1))654; X32-NEXT: symbolic max exit count for bb8: ***COULDNOTCOMPUTE***655; X32-NEXT: symbolic max exit count for bb10: (-2 + (zext i32 (ptrtoint ptr %arg to i32) to i64) + (-1 * %arg1))656;657bb:658 %i = icmp eq ptr %arg, null659 br i1 %i, label %bb14, label %bb3660 661bb3: ; preds = %bb662 %i4 = ptrtoint ptr %arg to i64663 br label %bb5664 665bb5: ; preds = %bb3666 %i6 = sub i64 %i4, %arg1667 br label %bb7668 669bb7: ; preds = %bb5670 br label %bb8671 672bb8: ; preds = %bb10, %bb7673 %i9 = phi i64 [ 1, %bb7 ], [ %i11, %bb10 ]674 br i1 %arg2, label %bb10, label %bb13675 676bb10: ; preds = %bb8677 %i11 = add nuw i64 %i9, 1678 %i12 = icmp eq i64 %i11, %i6679 br i1 %i12, label %bb13, label %bb8680 681bb13: ; preds = %bb10, %bb8682 ret void683 684bb14: ; preds = %bb685 ret void686}687