402 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -S -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s3 4!0 = !{i8 0, i8 127}5 6define void @f0(ptr %len_addr) {7; CHECK-LABEL: 'f0'8; CHECK-NEXT: Classifying expressions for: @f09; CHECK-NEXT: %len = load i8, ptr %len_addr, align 1, !range !010; CHECK-NEXT: --> %len U: [0,127) S: [0,127)11; CHECK-NEXT: %len_norange = load i8, ptr %len_addr, align 112; CHECK-NEXT: --> %len_norange U: full-set S: full-set13; CHECK-NEXT: %t0 = add i8 %len, 114; CHECK-NEXT: --> (1 + %len)<nuw><nsw> U: [1,-128) S: [1,-128)15; CHECK-NEXT: %t1 = add i8 %len, 216; CHECK-NEXT: --> (2 + %len)<nuw> U: [2,-127) S: [2,-127)17; CHECK-NEXT: %t2 = sub i8 %len, 118; CHECK-NEXT: --> (-1 + %len)<nsw> U: [-1,126) S: [-1,126)19; CHECK-NEXT: %t3 = sub i8 %len, 220; CHECK-NEXT: --> (-2 + %len)<nsw> U: [-2,125) S: [-2,125)21; CHECK-NEXT: %q0 = add i8 %len_norange, 122; CHECK-NEXT: --> (1 + %len_norange) U: full-set S: full-set23; CHECK-NEXT: %q1 = add i8 %len_norange, 224; CHECK-NEXT: --> (2 + %len_norange) U: full-set S: full-set25; CHECK-NEXT: %q2 = sub i8 %len_norange, 126; CHECK-NEXT: --> (-1 + %len_norange) U: full-set S: full-set27; CHECK-NEXT: %q3 = sub i8 %len_norange, 228; CHECK-NEXT: --> (-2 + %len_norange) U: full-set S: full-set29; CHECK-NEXT: Determining loop execution counts for: @f030;31 entry:32 %len = load i8, ptr %len_addr, !range !033 %len_norange = load i8, ptr %len_addr34 35 %t0 = add i8 %len, 136 %t1 = add i8 %len, 237 38 %t2 = sub i8 %len, 139 %t3 = sub i8 %len, 240 41 %q0 = add i8 %len_norange, 142 %q1 = add i8 %len_norange, 243 44 %q2 = sub i8 %len_norange, 145 %q3 = sub i8 %len_norange, 246 47 ret void48}49 50define void @f1(ptr %len_addr) {51; CHECK-LABEL: 'f1'52; CHECK-NEXT: Classifying expressions for: @f153; CHECK-NEXT: %len = load i8, ptr %len_addr, align 1, !range !054; CHECK-NEXT: --> %len U: [0,127) S: [0,127)55; CHECK-NEXT: %len_norange = load i8, ptr %len_addr, align 156; CHECK-NEXT: --> %len_norange U: full-set S: full-set57; CHECK-NEXT: %t0 = add i8 %len, -158; CHECK-NEXT: --> (-1 + %len)<nsw> U: [-1,126) S: [-1,126)59; CHECK-NEXT: %t1 = add i8 %len, -260; CHECK-NEXT: --> (-2 + %len)<nsw> U: [-2,125) S: [-2,125)61; CHECK-NEXT: %t0.sext = sext i8 %t0 to i1662; CHECK-NEXT: --> (-1 + (zext i8 %len to i16))<nsw> U: [-1,126) S: [-1,126)63; CHECK-NEXT: %t1.sext = sext i8 %t1 to i1664; CHECK-NEXT: --> (-2 + (zext i8 %len to i16))<nsw> U: [-2,125) S: [-2,125)65; CHECK-NEXT: %q0 = add i8 %len_norange, 166; CHECK-NEXT: --> (1 + %len_norange) U: full-set S: full-set67; CHECK-NEXT: %q1 = add i8 %len_norange, 268; CHECK-NEXT: --> (2 + %len_norange) U: full-set S: full-set69; CHECK-NEXT: %q0.sext = sext i8 %q0 to i1670; CHECK-NEXT: --> (sext i8 (1 + %len_norange) to i16) U: [-128,128) S: [-128,128)71; CHECK-NEXT: %q1.sext = sext i8 %q1 to i1672; CHECK-NEXT: --> (sext i8 (2 + %len_norange) to i16) U: [-128,128) S: [-128,128)73; CHECK-NEXT: Determining loop execution counts for: @f174;75 entry:76 %len = load i8, ptr %len_addr, !range !077 %len_norange = load i8, ptr %len_addr78 79 %t0 = add i8 %len, -180 %t1 = add i8 %len, -281 82 %t0.sext = sext i8 %t0 to i1683 %t1.sext = sext i8 %t1 to i1684 85 %q0 = add i8 %len_norange, 186 %q1 = add i8 %len_norange, 287 88 %q0.sext = sext i8 %q0 to i1689 %q1.sext = sext i8 %q1 to i1690 91 ret void92}93 94define void @f2(ptr %len_addr) {95; CHECK-LABEL: 'f2'96; CHECK-NEXT: Classifying expressions for: @f297; CHECK-NEXT: %len = load i8, ptr %len_addr, align 1, !range !098; CHECK-NEXT: --> %len U: [0,127) S: [0,127)99; CHECK-NEXT: %len_norange = load i8, ptr %len_addr, align 1100; CHECK-NEXT: --> %len_norange U: full-set S: full-set101; CHECK-NEXT: %t0 = add i8 %len, 1102; CHECK-NEXT: --> (1 + %len)<nuw><nsw> U: [1,-128) S: [1,-128)103; CHECK-NEXT: %t1 = add i8 %len, 2104; CHECK-NEXT: --> (2 + %len)<nuw> U: [2,-127) S: [2,-127)105; CHECK-NEXT: %t0.zext = zext i8 %t0 to i16106; CHECK-NEXT: --> (1 + (zext i8 %len to i16))<nuw><nsw> U: [1,128) S: [1,128)107; CHECK-NEXT: %t1.zext = zext i8 %t1 to i16108; CHECK-NEXT: --> (2 + (zext i8 %len to i16))<nuw><nsw> U: [2,129) S: [2,129)109; CHECK-NEXT: %q0 = add i8 %len_norange, 1110; CHECK-NEXT: --> (1 + %len_norange) U: full-set S: full-set111; CHECK-NEXT: %q1 = add i8 %len_norange, 2112; CHECK-NEXT: --> (2 + %len_norange) U: full-set S: full-set113; CHECK-NEXT: %q0.zext = zext i8 %q0 to i16114; CHECK-NEXT: --> (zext i8 (1 + %len_norange) to i16) U: [0,256) S: [0,256)115; CHECK-NEXT: %q1.zext = zext i8 %q1 to i16116; CHECK-NEXT: --> (zext i8 (2 + %len_norange) to i16) U: [0,256) S: [0,256)117; CHECK-NEXT: Determining loop execution counts for: @f2118;119 entry:120 %len = load i8, ptr %len_addr, !range !0121 %len_norange = load i8, ptr %len_addr122 123 %t0 = add i8 %len, 1124 %t1 = add i8 %len, 2125 126 %t0.zext = zext i8 %t0 to i16127 %t1.zext = zext i8 %t1 to i16128 129 %q0 = add i8 %len_norange, 1130 %q1 = add i8 %len_norange, 2131 %q0.zext = zext i8 %q0 to i16132 %q1.zext = zext i8 %q1 to i16133 134 135 ret void136}137 138@z_addr = external global [16 x i8], align 4139@z_addr_noalign = external global [16 x i8]140 141%union = type { [10 x [4 x float]] }142@tmp_addr = external unnamed_addr global { %union, [2000 x i8] }143 144define void @f3(ptr %x_addr, ptr %y_addr, ptr %tmp_addr) {145; CHECK-LABEL: 'f3'146; CHECK-NEXT: Classifying expressions for: @f3147; CHECK-NEXT: %x = load i8, ptr %x_addr, align 1148; CHECK-NEXT: --> %x U: full-set S: full-set149; CHECK-NEXT: %t0 = mul i8 %x, 4150; CHECK-NEXT: --> (4 * %x) U: [0,-3) S: [-128,125)151; CHECK-NEXT: %t1 = add i8 %t0, 5152; CHECK-NEXT: --> (5 + (4 * %x)) U: [5,2) S: [-123,-126)153; CHECK-NEXT: %t1.zext = zext i8 %t1 to i16154; CHECK-NEXT: --> (1 + (zext i8 (4 + (4 * %x)) to i16))<nuw><nsw> U: [1,254) S: [1,257)155; CHECK-NEXT: %q0 = mul i8 %x, 4156; CHECK-NEXT: --> (4 * %x) U: [0,-3) S: [-128,125)157; CHECK-NEXT: %q1 = add i8 %q0, 7158; CHECK-NEXT: --> (7 + (4 * %x)) U: [7,4) S: [-121,-124)159; CHECK-NEXT: %q1.zext = zext i8 %q1 to i16160; CHECK-NEXT: --> (3 + (zext i8 (4 + (4 * %x)) to i16))<nuw><nsw> U: [3,256) S: [3,259)161; CHECK-NEXT: %p0 = mul i8 %x, 4162; CHECK-NEXT: --> (4 * %x) U: [0,-3) S: [-128,125)163; CHECK-NEXT: %p1 = add i8 %p0, 8164; CHECK-NEXT: --> (8 + (4 * %x)) U: [0,-3) S: [-128,125)165; CHECK-NEXT: %p1.zext = zext i8 %p1 to i16166; CHECK-NEXT: --> (zext i8 (8 + (4 * %x)) to i16) U: [0,253) S: [0,256)167; CHECK-NEXT: %r0 = mul i8 %x, 4168; CHECK-NEXT: --> (4 * %x) U: [0,-3) S: [-128,125)169; CHECK-NEXT: %r1 = add i8 %r0, -2170; CHECK-NEXT: --> (-2 + (4 * %x)) U: [0,-1) S: [-128,127)171; CHECK-NEXT: %r1.zext = zext i8 %r1 to i16172; CHECK-NEXT: --> (2 + (zext i8 (-4 + (4 * %x)) to i16))<nuw><nsw> U: [2,255) S: [2,258)173; CHECK-NEXT: %y = load i8, ptr %y_addr, align 1174; CHECK-NEXT: --> %y U: full-set S: full-set175; CHECK-NEXT: %s0 = mul i8 %x, 32176; CHECK-NEXT: --> (32 * %x) U: [0,-31) S: [-128,97)177; CHECK-NEXT: %s1 = mul i8 %y, 36178; CHECK-NEXT: --> (36 * %y) U: [0,-3) S: [-128,125)179; CHECK-NEXT: %s2 = add i8 %s0, %s1180; CHECK-NEXT: --> ((32 * %x) + (36 * %y)) U: [0,-3) S: [-128,125)181; CHECK-NEXT: %s3 = add i8 %s2, 5182; CHECK-NEXT: --> (5 + (32 * %x) + (36 * %y)) U: full-set S: full-set183; CHECK-NEXT: %s3.zext = zext i8 %s3 to i16184; CHECK-NEXT: --> (1 + (zext i8 (4 + (32 * %x) + (36 * %y)) to i16))<nuw><nsw> U: [1,254) S: [1,257)185; CHECK-NEXT: %ptr = bitcast ptr @z_addr to ptr186; CHECK-NEXT: --> @z_addr U: [4,-19) S: [-9223372036854775808,9223372036854775805)187; CHECK-NEXT: %int0 = ptrtoint ptr %ptr to i32188; CHECK-NEXT: --> (trunc i64 (ptrtoint ptr @z_addr to i64) to i32) U: [0,-3) S: [-2147483648,2147483645)189; CHECK-NEXT: %int5 = add i32 %int0, 5190; CHECK-NEXT: --> (5 + (trunc i64 (ptrtoint ptr @z_addr to i64) to i32)) U: [5,2) S: [-2147483643,-2147483646)191; CHECK-NEXT: %int.zext = zext i32 %int5 to i64192; CHECK-NEXT: --> (1 + (zext i32 (4 + (trunc i64 (ptrtoint ptr @z_addr to i64) to i32)) to i64))<nuw><nsw> U: [1,4294967294) S: [1,4294967297)193; CHECK-NEXT: %ptr_noalign = bitcast ptr @z_addr_noalign to ptr194; CHECK-NEXT: --> @z_addr_noalign U: [1,-16) S: full-set195; CHECK-NEXT: %int0_na = ptrtoint ptr %ptr_noalign to i32196; CHECK-NEXT: --> (trunc i64 (ptrtoint ptr @z_addr_noalign to i64) to i32) U: full-set S: full-set197; CHECK-NEXT: %int5_na = add i32 %int0_na, 5198; CHECK-NEXT: --> (5 + (trunc i64 (ptrtoint ptr @z_addr_noalign to i64) to i32)) U: full-set S: full-set199; CHECK-NEXT: %int.zext_na = zext i32 %int5_na to i64200; CHECK-NEXT: --> (zext i32 (5 + (trunc i64 (ptrtoint ptr @z_addr_noalign to i64) to i32)) to i64) U: [0,4294967296) S: [0,4294967296)201; CHECK-NEXT: %tmp = load i32, ptr %tmp_addr, align 4202; CHECK-NEXT: --> %tmp U: full-set S: full-set203; CHECK-NEXT: %mul = and i32 %tmp, -4204; CHECK-NEXT: --> (4 * (%tmp /u 4))<nuw> U: [0,-3) S: [-2147483648,2147483645)205; CHECK-NEXT: %add4 = add i32 %mul, 4206; CHECK-NEXT: --> (4 + (4 * (%tmp /u 4))<nuw>) U: [0,-3) S: [-2147483648,2147483645)207; CHECK-NEXT: %add4.zext = zext i32 %add4 to i64208; CHECK-NEXT: --> (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64) U: [0,4294967293) S: [0,4294967296)209; CHECK-NEXT: %sunkaddr3 = mul i64 %add4.zext, 4210; CHECK-NEXT: --> (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> U: [0,17179869169) S: [0,17179869181)211; CHECK-NEXT: %sunkaddr4 = getelementptr inbounds i8, ptr @tmp_addr, i64 %sunkaddr3212; CHECK-NEXT: --> ((4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> + @tmp_addr) U: [0,-3) S: [-9223372036854775808,9223372036854775805)213; CHECK-NEXT: %sunkaddr5 = getelementptr inbounds i8, ptr %sunkaddr4, i64 4096214; CHECK-NEXT: --> (4096 + (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> + @tmp_addr) U: [0,-3) S: [-9223372036854775808,9223372036854775805)215; CHECK-NEXT: %addr4.cast = bitcast ptr %sunkaddr5 to ptr216; CHECK-NEXT: --> (4096 + (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> + @tmp_addr) U: [0,-3) S: [-9223372036854775808,9223372036854775805)217; CHECK-NEXT: %addr4.incr = getelementptr i32, ptr %addr4.cast, i64 1218; CHECK-NEXT: --> (4100 + (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> + @tmp_addr) U: [0,-3) S: [-9223372036854775808,9223372036854775805)219; CHECK-NEXT: %add5 = add i32 %mul, 5220; CHECK-NEXT: --> (5 + (4 * (%tmp /u 4))<nuw>) U: [5,2) S: [-2147483643,-2147483646)221; CHECK-NEXT: %add5.zext = zext i32 %add5 to i64222; CHECK-NEXT: --> (1 + (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> U: [1,4294967294) S: [1,4294967297)223; CHECK-NEXT: %sunkaddr0 = mul i64 %add5.zext, 4224; CHECK-NEXT: --> (4 + (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw>)<nuw><nsw> U: [4,17179869173) S: [4,17179869185)225; CHECK-NEXT: %sunkaddr1 = getelementptr inbounds i8, ptr @tmp_addr, i64 %sunkaddr0226; CHECK-NEXT: --> (4 + (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> + @tmp_addr) U: [0,-3) S: [-9223372036854775808,9223372036854775805)227; CHECK-NEXT: %sunkaddr2 = getelementptr inbounds i8, ptr %sunkaddr1, i64 4096228; CHECK-NEXT: --> (4100 + (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> + @tmp_addr) U: [0,-3) S: [-9223372036854775808,9223372036854775805)229; CHECK-NEXT: %addr5.cast = bitcast ptr %sunkaddr2 to ptr230; CHECK-NEXT: --> (4100 + (4 * (zext i32 (4 + (4 * (%tmp /u 4))<nuw>) to i64))<nuw><nsw> + @tmp_addr) U: [0,-3) S: [-9223372036854775808,9223372036854775805)231; CHECK-NEXT: Determining loop execution counts for: @f3232;233 entry:234 %x = load i8, ptr %x_addr235 %t0 = mul i8 %x, 4236 %t1 = add i8 %t0, 5237 %t1.zext = zext i8 %t1 to i16238 239 %q0 = mul i8 %x, 4240 %q1 = add i8 %q0, 7241 %q1.zext = zext i8 %q1 to i16242 243 %p0 = mul i8 %x, 4244 %p1 = add i8 %p0, 8245 %p1.zext = zext i8 %p1 to i16246 247 %r0 = mul i8 %x, 4248 %r1 = add i8 %r0, 254249 %r1.zext = zext i8 %r1 to i16250 251 %y = load i8, ptr %y_addr252 %s0 = mul i8 %x, 32253 %s1 = mul i8 %y, 36254 %s2 = add i8 %s0, %s1255 %s3 = add i8 %s2, 5256 %s3.zext = zext i8 %s3 to i16257 258 %ptr = bitcast ptr @z_addr to ptr259 %int0 = ptrtoint ptr %ptr to i32260 %int5 = add i32 %int0, 5261 %int.zext = zext i32 %int5 to i64262 263 %ptr_noalign = bitcast ptr @z_addr_noalign to ptr264 %int0_na = ptrtoint ptr %ptr_noalign to i32265 %int5_na = add i32 %int0_na, 5266 %int.zext_na = zext i32 %int5_na to i64267 268 %tmp = load i32, ptr %tmp_addr269 %mul = and i32 %tmp, -4270 %add4 = add i32 %mul, 4271 %add4.zext = zext i32 %add4 to i64272 %sunkaddr3 = mul i64 %add4.zext, 4273 %sunkaddr4 = getelementptr inbounds i8, ptr @tmp_addr, i64 %sunkaddr3274 %sunkaddr5 = getelementptr inbounds i8, ptr %sunkaddr4, i64 4096275 %addr4.cast = bitcast ptr %sunkaddr5 to ptr276 %addr4.incr = getelementptr i32, ptr %addr4.cast, i64 1277 278 %add5 = add i32 %mul, 5279 %add5.zext = zext i32 %add5 to i64280 %sunkaddr0 = mul i64 %add5.zext, 4281 %sunkaddr1 = getelementptr inbounds i8, ptr @tmp_addr, i64 %sunkaddr0282 %sunkaddr2 = getelementptr inbounds i8, ptr %sunkaddr1, i64 4096283 %addr5.cast = bitcast ptr %sunkaddr2 to ptr284 285 ret void286}287 288 289; The next two tests demonstrate that (at the time of being written), SCEV290; will incorrectly propagate flags from an add in one scope to an add in291; another scope. Note as well that the results are visit order dependent292; and (as shown in the _b variant) the printer frequently makes the actual293; bug very hard to see.294define i1 @test2_a(i32 %a, i32 %b, i1 %will_overflow) {295; CHECK-LABEL: 'test2_a'296; CHECK-NEXT: Classifying expressions for: @test2_a297; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]298; CHECK-NEXT: --> {%a,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }299; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, %b300; CHECK-NEXT: --> {(%a + %b),+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }301; CHECK-NEXT: %trap = udiv i32 %a, %iv.next302; CHECK-NEXT: --> (%a /u {(%a + %b),+,%b}<nuw><nsw><%loop>) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }303; CHECK-NEXT: %c = add i32 %a, %b304; CHECK-NEXT: --> (%a + %b) U: full-set S: full-set305; CHECK-NEXT: Determining loop execution counts for: @test2_a306; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.307; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.308; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.309;310entry:311 br i1 %will_overflow, label %exit1, label %loop312 313loop:314 %iv = phi i32 [%a, %entry], [%iv.next, %loop]315 %iv.next = add nuw nsw i32 %iv, %b316 %trap = udiv i32 %a, %iv.next ;; Use to force poison -> UB317 %ret2 = icmp ult i32 %iv.next, %a318 ; Note: backedge is unreachable here319 br i1 %ret2, label %loop, label %exit2320 321exit2:322 ret i1 false323 324exit1:325 %c = add i32 %a, %b326 %ret1 = icmp ult i32 %c, %a327 ret i1 false328}329 330define i1 @test2_b(i32 %a, i32 %b, i1 %will_overflow) {331; CHECK-LABEL: 'test2_b'332; CHECK-NEXT: Classifying expressions for: @test2_b333; CHECK-NEXT: %c = add i32 %a, %b334; CHECK-NEXT: --> (%a + %b) U: full-set S: full-set335; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]336; CHECK-NEXT: --> {%a,+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }337; CHECK-NEXT: %iv.next = add nuw nsw i32 %iv, %b338; CHECK-NEXT: --> {(%a + %b),+,%b}<nuw><nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }339; CHECK-NEXT: %trap = udiv i32 %a, %iv.next340; CHECK-NEXT: --> (%a /u {(%a + %b),+,%b}<nuw><nsw><%loop>) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }341; CHECK-NEXT: Determining loop execution counts for: @test2_b342; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.343; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.344; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.345;346entry:347 br i1 %will_overflow, label %exit1, label %loop348 349exit1:350 %c = add i32 %a, %b351 %ret1 = icmp ult i32 %c, %a352 ret i1 false353 354loop:355 %iv = phi i32 [%a, %entry], [%iv.next, %loop]356 %iv.next = add nuw nsw i32 %iv, %b357 %trap = udiv i32 %a, %iv.next358 %ret2 = icmp ult i32 %iv.next, %a359 ; Note: backedge is unreachable here360 br i1 %ret2, label %loop, label %exit2361 362exit2:363 ret i1 false364}365 366 367define void @dereferenceable_arg(ptr dereferenceable(128) %len_addr, ptr dereferenceable(128) align(8) %len_addr2, ptr dereferenceable(13) align(1) %len_addr3) {368; CHECK-LABEL: 'dereferenceable_arg'369; CHECK-NEXT: Classifying expressions for: @dereferenceable_arg370; CHECK-NEXT: %ptr = bitcast ptr %len_addr to ptr371; CHECK-NEXT: --> %len_addr U: [1,-128) S: full-set372; CHECK-NEXT: %ptr2 = bitcast ptr %len_addr2 to ptr373; CHECK-NEXT: --> %len_addr2 U: [8,-135) S: [-9223372036854775808,9223372036854775801)374; CHECK-NEXT: %ptr3 = bitcast ptr %len_addr3 to ptr375; CHECK-NEXT: --> %len_addr3 U: [1,-13) S: full-set376; CHECK-NEXT: Determining loop execution counts for: @dereferenceable_arg377;378 entry:379 %ptr = bitcast ptr %len_addr to ptr380 %ptr2 = bitcast ptr %len_addr2 to ptr381 %ptr3 = bitcast ptr %len_addr3 to ptr382 383 ret void384}385 386 387define void @dereferenceable_or_null_arg(ptr dereferenceable_or_null(128) %len_addr, ptr dereferenceable_or_null(128) align(8) %len_addr2) {388; CHECK-LABEL: 'dereferenceable_or_null_arg'389; CHECK-NEXT: Classifying expressions for: @dereferenceable_or_null_arg390; CHECK-NEXT: %ptr = bitcast ptr %len_addr to ptr391; CHECK-NEXT: --> %len_addr U: [0,-128) S: full-set392; CHECK-NEXT: %ptr2 = bitcast ptr %len_addr2 to ptr393; CHECK-NEXT: --> %len_addr2 U: [0,-135) S: [-9223372036854775808,9223372036854775801)394; CHECK-NEXT: Determining loop execution counts for: @dereferenceable_or_null_arg395;396 entry:397 %ptr = bitcast ptr %len_addr to ptr398 %ptr2 = bitcast ptr %len_addr2 to ptr399 400 ret void401}402