763 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s3 4; Tests for PR47904.5 6define void @test_trip_multiple_4(i32 %num) {7; CHECK-LABEL: 'test_trip_multiple_4'8; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_49; CHECK-NEXT: %u = urem i32 %num, 410; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)11; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]12; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }13; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 114; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }15; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_416; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)17; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -218; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)19; CHECK-NEXT: Loop %for.body: Trip multiple is 420;21entry:22 %u = urem i32 %num, 423 %cmp = icmp eq i32 %u, 024 tail call void @llvm.assume(i1 %cmp)25 %cmp.1 = icmp uge i32 %num, 426 tail call void @llvm.assume(i1 %cmp.1)27 br label %for.body28 29for.body:30 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]31 %inc = add nuw nsw i32 %i.010, 132 %cmp2 = icmp ult i32 %inc, %num33 br i1 %cmp2, label %for.body, label %exit34 35exit:36 ret void37}38 39define void @test_trip_multiple_4_guard(i32 %num) {40; CHECK-LABEL: 'test_trip_multiple_4_guard'41; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_guard42; CHECK-NEXT: %u = urem i32 %num, 443; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)44; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]45; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }46; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 147; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }48; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_guard49; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)50; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -251; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)52; CHECK-NEXT: Loop %for.body: Trip multiple is 453;54entry:55 %u = urem i32 %num, 456 %cmp = icmp eq i32 %u, 057 call void(i1, ...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]58 %cmp.1 = icmp uge i32 %num, 459 call void(i1, ...) @llvm.experimental.guard(i1 %cmp.1) [ "deopt"() ]60 br label %for.body61 62for.body:63 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]64 %inc = add nuw nsw i32 %i.010, 165 %cmp2 = icmp ult i32 %inc, %num66 br i1 %cmp2, label %for.body, label %exit67 68exit:69 ret void70}71 72 73define void @test_trip_multiple_4_ugt_5(i32 %num) {74; CHECK-LABEL: 'test_trip_multiple_4_ugt_5'75; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_ugt_576; CHECK-NEXT: %u = urem i32 %num, 477; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)78; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]79; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }80; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 181; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }82; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_ugt_583; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)84; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -285; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)86; CHECK-NEXT: Loop %for.body: Trip multiple is 487;88entry:89 %u = urem i32 %num, 490 %cmp = icmp eq i32 %u, 091 tail call void @llvm.assume(i1 %cmp)92 %cmp.1 = icmp ugt i32 %num, 593 tail call void @llvm.assume(i1 %cmp.1)94 br label %for.body95 96for.body:97 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]98 %inc = add nuw nsw i32 %i.010, 199 %cmp2 = icmp ult i32 %inc, %num100 br i1 %cmp2, label %for.body, label %exit101 102exit:103 ret void104}105 106define void @test_trip_multiple_4_ugt_5_order_swapped(i32 %num) {107; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.108; CHECK-LABEL: 'test_trip_multiple_4_ugt_5_order_swapped'109; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_ugt_5_order_swapped110; CHECK-NEXT: %u = urem i32 %num, 4111; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)112; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]113; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }114; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1115; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }116; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_ugt_5_order_swapped117; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)118; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2119; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)120; CHECK-NEXT: Loop %for.body: Trip multiple is 4121;122entry:123 %u = urem i32 %num, 4124 %cmp.1 = icmp ugt i32 %num, 5125 tail call void @llvm.assume(i1 %cmp.1)126 %cmp = icmp eq i32 %u, 0127 tail call void @llvm.assume(i1 %cmp)128 br label %for.body129 130for.body:131 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]132 %inc = add nuw nsw i32 %i.010, 1133 %cmp2 = icmp ult i32 %inc, %num134 br i1 %cmp2, label %for.body, label %exit135 136exit:137 ret void138}139 140define void @test_trip_multiple_4_sgt_5(i32 %num) {141; CHECK-LABEL: 'test_trip_multiple_4_sgt_5'142; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sgt_5143; CHECK-NEXT: %u = urem i32 %num, 4144; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)145; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]146; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }147; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1148; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }149; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sgt_5150; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)151; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646152; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)153; CHECK-NEXT: Loop %for.body: Trip multiple is 4154;155entry:156 %u = urem i32 %num, 4157 %cmp = icmp eq i32 %u, 0158 tail call void @llvm.assume(i1 %cmp)159 %cmp.1 = icmp sgt i32 %num, 5160 tail call void @llvm.assume(i1 %cmp.1)161 br label %for.body162 163for.body:164 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]165 %inc = add nuw nsw i32 %i.010, 1166 %cmp2 = icmp slt i32 %inc, %num167 br i1 %cmp2, label %for.body, label %exit168 169exit:170 ret void171}172 173define void @test_trip_multiple_4_sgt_5_order_swapped(i32 %num) {174; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.175; CHECK-LABEL: 'test_trip_multiple_4_sgt_5_order_swapped'176; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sgt_5_order_swapped177; CHECK-NEXT: %u = urem i32 %num, 4178; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)179; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]180; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }181; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1182; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }183; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sgt_5_order_swapped184; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)185; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646186; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)187; CHECK-NEXT: Loop %for.body: Trip multiple is 4188;189entry:190 %u = urem i32 %num, 4191 %cmp.1 = icmp sgt i32 %num, 5192 tail call void @llvm.assume(i1 %cmp.1)193 %cmp = icmp eq i32 %u, 0194 tail call void @llvm.assume(i1 %cmp)195 br label %for.body196 197for.body:198 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]199 %inc = add nuw nsw i32 %i.010, 1200 %cmp2 = icmp slt i32 %inc, %num201 br i1 %cmp2, label %for.body, label %exit202 203exit:204 ret void205}206 207define void @test_trip_multiple_4_uge_5(i32 %num) {208; CHECK-LABEL: 'test_trip_multiple_4_uge_5'209; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_uge_5210; CHECK-NEXT: %u = urem i32 %num, 4211; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)212; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]213; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }214; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1215; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }216; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_uge_5217; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)218; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2219; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)220; CHECK-NEXT: Loop %for.body: Trip multiple is 4221;222entry:223 %u = urem i32 %num, 4224 %cmp = icmp eq i32 %u, 0225 tail call void @llvm.assume(i1 %cmp)226 %cmp.1 = icmp uge i32 %num, 5227 tail call void @llvm.assume(i1 %cmp.1)228 br label %for.body229 230for.body:231 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]232 %inc = add nuw nsw i32 %i.010, 1233 %cmp2 = icmp ult i32 %inc, %num234 br i1 %cmp2, label %for.body, label %exit235 236exit:237 ret void238}239 240define void @test_trip_multiple_4_uge_5_order_swapped(i32 %num) {241; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.242; CHECK-LABEL: 'test_trip_multiple_4_uge_5_order_swapped'243; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_uge_5_order_swapped244; CHECK-NEXT: %u = urem i32 %num, 4245; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)246; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]247; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }248; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1249; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }250; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_uge_5_order_swapped251; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)252; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2253; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)254; CHECK-NEXT: Loop %for.body: Trip multiple is 4255;256entry:257 %u = urem i32 %num, 4258 %cmp = icmp eq i32 %u, 0259 %cmp.1 = icmp uge i32 %num, 5260 tail call void @llvm.assume(i1 %cmp.1)261 tail call void @llvm.assume(i1 %cmp)262 br label %for.body263 264for.body:265 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]266 %inc = add nuw nsw i32 %i.010, 1267 %cmp2 = icmp ult i32 %inc, %num268 br i1 %cmp2, label %for.body, label %exit269 270exit:271 ret void272}273 274define void @test_trip_multiple_4_sge_5(i32 %num) {275; TODO: Trip multiple can be 4, it is missed due to the processing order of the assumes.276; CHECK-LABEL: 'test_trip_multiple_4_sge_5'277; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sge_5278; CHECK-NEXT: %u = urem i32 %num, 4279; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)280; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]281; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }282; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1283; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }284; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sge_5285; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)286; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646287; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)288; CHECK-NEXT: Loop %for.body: Trip multiple is 4289;290entry:291 %u = urem i32 %num, 4292 %cmp = icmp eq i32 %u, 0293 tail call void @llvm.assume(i1 %cmp)294 %cmp.1 = icmp sge i32 %num, 5295 tail call void @llvm.assume(i1 %cmp.1)296 br label %for.body297 298for.body:299 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]300 %inc = add nuw nsw i32 %i.010, 1301 %cmp2 = icmp slt i32 %inc, %num302 br i1 %cmp2, label %for.body, label %exit303 304exit:305 ret void306}307 308define void @test_trip_multiple_4_sge_5_order_swapped(i32 %num) {309; CHECK-LABEL: 'test_trip_multiple_4_sge_5_order_swapped'310; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_sge_5_order_swapped311; CHECK-NEXT: %u = urem i32 %num, 4312; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)313; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]314; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,2147483647) S: [0,2147483647) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }315; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1316; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }317; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_sge_5_order_swapped318; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)319; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2147483646320; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)321; CHECK-NEXT: Loop %for.body: Trip multiple is 4322;323entry:324 %u = urem i32 %num, 4325 %cmp = icmp eq i32 %u, 0326 %cmp.1 = icmp sge i32 %num, 5327 tail call void @llvm.assume(i1 %cmp.1)328 tail call void @llvm.assume(i1 %cmp)329 br label %for.body330 331for.body:332 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]333 %inc = add nuw nsw i32 %i.010, 1334 %cmp2 = icmp slt i32 %inc, %num335 br i1 %cmp2, label %for.body, label %exit336 337exit:338 ret void339}340 341; Same as @test_trip_multiple_4 but with the icmp operands swapped.342define void @test_trip_multiple_4_icmp_ops_swapped(i32 %num) {343; CHECK-LABEL: 'test_trip_multiple_4_icmp_ops_swapped'344; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_icmp_ops_swapped345; CHECK-NEXT: %u = urem i32 %num, 4346; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)347; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]348; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }349; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1350; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }351; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_icmp_ops_swapped352; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)353; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2354; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)355; CHECK-NEXT: Loop %for.body: Trip multiple is 4356;357entry:358 %u = urem i32 %num, 4359 %cmp = icmp eq i32 0, %u360 tail call void @llvm.assume(i1 %cmp)361 %cmp.1 = icmp uge i32 %num, 4362 tail call void @llvm.assume(i1 %cmp.1)363 br label %for.body364 365for.body:366 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]367 %inc = add nuw nsw i32 %i.010, 1368 %cmp2 = icmp ult i32 %inc, %num369 br i1 %cmp2, label %for.body, label %exit370 371exit:372 ret void373}374 375define void @test_trip_multiple_4_upper_lower_bounds(i32 %num) {376; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds'377; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds378; CHECK-NEXT: %u = urem i32 %num, 4379; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)380; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]381; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }382; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1383; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }384; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds385; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)386; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2387; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)388; CHECK-NEXT: Loop %for.body: Trip multiple is 4389;390entry:391 %cmp.1 = icmp uge i32 %num, 5392 tail call void @llvm.assume(i1 %cmp.1)393 %u = urem i32 %num, 4394 %cmp = icmp eq i32 %u, 0395 tail call void @llvm.assume(i1 %cmp)396 %cmp.2 = icmp ult i32 %num, 59000397 tail call void @llvm.assume(i1 %cmp.2)398 br label %for.body399 400for.body:401 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]402 %inc = add nuw nsw i32 %i.010, 1403 %cmp2 = icmp ult i32 %inc, %num404 br i1 %cmp2, label %for.body, label %exit405 406exit:407 ret void408}409 410define void @test_trip_multiple_4_upper_lower_bounds_swapped1(i32 %num) {411; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds_swapped1'412; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds_swapped1413; CHECK-NEXT: %u = urem i32 %num, 4414; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)415; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]416; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }417; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1418; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }419; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds_swapped1420; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)421; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2422; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)423; CHECK-NEXT: Loop %for.body: Trip multiple is 4424;425entry:426 %cmp.1 = icmp uge i32 %num, 5427 tail call void @llvm.assume(i1 %cmp.1)428 %u = urem i32 %num, 4429 %cmp = icmp eq i32 %u, 0430 tail call void @llvm.assume(i1 %cmp)431 %cmp.2 = icmp ult i32 %num, 59000432 tail call void @llvm.assume(i1 %cmp.2)433 br label %for.body434 435for.body:436 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]437 %inc = add nuw nsw i32 %i.010, 1438 %cmp2 = icmp ult i32 %inc, %num439 br i1 %cmp2, label %for.body, label %exit440 441exit:442 ret void443}444 445define void @test_trip_multiple_4_upper_lower_bounds_swapped2(i32 %num) {446; CHECK-LABEL: 'test_trip_multiple_4_upper_lower_bounds_swapped2'447; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_upper_lower_bounds_swapped2448; CHECK-NEXT: %u = urem i32 %num, 4449; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)450; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]451; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }452; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1453; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }454; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_upper_lower_bounds_swapped2455; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)456; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2457; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)458; CHECK-NEXT: Loop %for.body: Trip multiple is 4459;460entry:461 %cmp.1 = icmp uge i32 %num, 5462 tail call void @llvm.assume(i1 %cmp.1)463 %cmp.2 = icmp ult i32 %num, 59000464 tail call void @llvm.assume(i1 %cmp.2)465 %u = urem i32 %num, 4466 %cmp = icmp eq i32 %u, 0467 tail call void @llvm.assume(i1 %cmp)468 br label %for.body469 470for.body:471 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]472 %inc = add nuw nsw i32 %i.010, 1473 %cmp2 = icmp ult i32 %inc, %num474 br i1 %cmp2, label %for.body, label %exit475 476exit:477 ret void478}479 480define void @test_trip_multiple_5(i32 %num) {481; CHECK-LABEL: 'test_trip_multiple_5'482; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_5483; CHECK-NEXT: %u = urem i32 %num, 5484; CHECK-NEXT: --> ((-5 * (%num /u 5)) + %num) U: full-set S: full-set485; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]486; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-2147483648) S: [0,-2147483648) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }487; CHECK-NEXT: %inc = add nuw nsw i32 %i.010, 1488; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-2147483648) S: [1,-2147483648) Exits: %num LoopDispositions: { %for.body: Computable }489; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_5490; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num)491; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2492; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num)493; CHECK-NEXT: Loop %for.body: Trip multiple is 5494;495entry:496 %u = urem i32 %num, 5497 %cmp = icmp eq i32 %u, 0498 tail call void @llvm.assume(i1 %cmp)499 %cmp.1 = icmp uge i32 %num, 5500 tail call void @llvm.assume(i1 %cmp.1)501 br label %for.body502 503for.body:504 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]505 %inc = add nuw nsw i32 %i.010, 1506 %cmp2 = icmp ult i32 %inc, %num507 br i1 %cmp2, label %for.body, label %exit508 509exit:510 ret void511}512 513define void @test_trunc_operand_larger_than_urem_expr(i64 %N) {514; CHECK-LABEL: 'test_trunc_operand_larger_than_urem_expr'515; CHECK-NEXT: Classifying expressions for: @test_trunc_operand_larger_than_urem_expr516; CHECK-NEXT: %conv = trunc i64 %N to i32517; CHECK-NEXT: --> (trunc i64 %N to i32) U: full-set S: full-set518; CHECK-NEXT: %and = and i32 %conv, 1519; CHECK-NEXT: --> (zext i1 (trunc i64 %N to i1) to i32) U: [0,2) S: [0,2)520; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]521; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: (-1 + %N) LoopDispositions: { %for.body: Computable }522; CHECK-NEXT: %iv.next = add nuw nsw i64 %iv, 1523; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: %N LoopDispositions: { %for.body: Computable }524; CHECK-NEXT: Determining loop execution counts for: @test_trunc_operand_larger_than_urem_expr525; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %N)526; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i64 -1527; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %N)528; CHECK-NEXT: Loop %for.body: Trip multiple is 1529;530entry:531 %conv = trunc i64 %N to i32532 %and = and i32 %conv, 1533 %cmp.pre = icmp eq i32 %and, 0534 br i1 %cmp.pre, label %for.body, label %exit535 536for.body:537 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]538 %iv.next = add nuw nsw i64 %iv, 1539 %cmp.1 = icmp ne i64 %iv.next, %N540 br i1 %cmp.1, label %for.body, label %exit541 542exit:543 ret void544}545 546; TODO: Even though %num is known to divide by 4, and the loop's IV advances by 4, SCEV can't compute the trip count.547define void @test_trip_multiple_4_vectorized_iv(i32 %num) {548; CHECK-LABEL: 'test_trip_multiple_4_vectorized_iv'549; CHECK-NEXT: Classifying expressions for: @test_trip_multiple_4_vectorized_iv550; CHECK-NEXT: %u = urem i32 %num, 4551; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)552; CHECK-NEXT: %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]553; CHECK-NEXT: --> {0,+,4}<%for.body> U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %for.body: Computable }554; CHECK-NEXT: %inc = add i32 %i.010, 4555; CHECK-NEXT: --> {4,+,4}<%for.body> U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %for.body: Computable }556; CHECK-NEXT: Determining loop execution counts for: @test_trip_multiple_4_vectorized_iv557; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.558; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.559; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.560;561entry:562 %u = urem i32 %num, 4563 %cmp = icmp eq i32 %u, 0564 tail call void @llvm.assume(i1 %cmp)565 br label %for.body566 567for.body:568 %i.010 = phi i32 [ 0, %entry ], [ %inc, %for.body ]569 %inc = add i32 %i.010, 4570 %cmp2 = icmp ult i32 %inc, %num571 br i1 %cmp2, label %for.body, label %exit572 573exit:574 ret void575}576 577define void @test_ptr_aligned_by_2_and_4_via_assumption(ptr %start, ptr %end) {578; CHECK-LABEL: 'test_ptr_aligned_by_2_and_4_via_assumption'579; CHECK-NEXT: Classifying expressions for: @test_ptr_aligned_by_2_and_4_via_assumption580; CHECK-NEXT: %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]581; CHECK-NEXT: --> {%start,+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }582; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4583; CHECK-NEXT: --> {(4 + %start),+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }584; CHECK-NEXT: Determining loop execution counts for: @test_ptr_aligned_by_2_and_4_via_assumption585; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.586; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.587; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.588; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)589; CHECK-NEXT: Predicates:590; CHECK-NEXT: Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0591; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903592; CHECK-NEXT: Predicates:593; CHECK-NEXT: Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0594; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)595; CHECK-NEXT: Predicates:596; CHECK-NEXT: Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0597;598entry:599 call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 2) ]600 call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 4) ]601 br label %loop602 603loop:604 %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]605 store ptr %iv, ptr %iv606 %iv.next = getelementptr i8, ptr %iv, i64 4607 %ec = icmp ne ptr %iv.next, %end608 br i1 %ec, label %loop, label %exit609 610exit:611 ret void612}613 614define void @test_ptrs_aligned_by_4_via_assumption(ptr %start, ptr %end) {615; CHECK-LABEL: 'test_ptrs_aligned_by_4_via_assumption'616; CHECK-NEXT: Classifying expressions for: @test_ptrs_aligned_by_4_via_assumption617; CHECK-NEXT: %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]618; CHECK-NEXT: --> {%start,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: (-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }619; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4620; CHECK-NEXT: --> {(4 + %start),+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: ((-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }621; CHECK-NEXT: Determining loop execution counts for: @test_ptrs_aligned_by_4_via_assumption622; CHECK-NEXT: Loop %loop: backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)623; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4611686018427387903624; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)625; CHECK-NEXT: Loop %loop: Trip multiple is 1626;627entry:628 call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 4) ]629 call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 4) ]630 br label %loop631 632loop:633 %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]634 store ptr %iv, ptr %iv635 %iv.next = getelementptr i8, ptr %iv, i64 4636 %ec = icmp ne ptr %iv.next, %end637 br i1 %ec, label %loop, label %exit638 639exit:640 ret void641}642 643define void @test_ptrs_aligned_by_8_via_assumption(ptr %start, ptr %end) {644; CHECK-LABEL: 'test_ptrs_aligned_by_8_via_assumption'645; CHECK-NEXT: Classifying expressions for: @test_ptrs_aligned_by_8_via_assumption646; CHECK-NEXT: %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]647; CHECK-NEXT: --> {%start,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: (-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }648; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4649; CHECK-NEXT: --> {(4 + %start)<nuw><nsw>,+,4}<%loop> U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: ((-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64) + %start) LoopDispositions: { %loop: Computable }650; CHECK-NEXT: Determining loop execution counts for: @test_ptrs_aligned_by_8_via_assumption651; CHECK-NEXT: Loop %loop: backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)652; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4611686018427387903653; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)654; CHECK-NEXT: Loop %loop: Trip multiple is 1655;656entry:657 call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 8) ]658 call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 8) ]659 br label %loop660 661loop:662 %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop ]663 store ptr %iv, ptr %iv664 %iv.next = getelementptr i8, ptr %iv, i64 4665 %ec = icmp ne ptr %iv.next, %end666 br i1 %ec, label %loop, label %exit667 668exit:669 ret void670}671 672declare i1 @cond()673 674define void @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors(ptr %start, ptr %end) {675; CHECK-LABEL: 'test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors'676; CHECK-NEXT: Classifying expressions for: @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors677; CHECK-NEXT: %c = call i1 @cond()678; CHECK-NEXT: --> %c U: full-set S: full-set679; CHECK-NEXT: %iv = phi ptr [ %start, %then ], [ %start, %else ], [ %iv.next, %loop ]680; CHECK-NEXT: --> {%start,+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }681; CHECK-NEXT: %iv.next = getelementptr i8, ptr %iv, i64 4682; CHECK-NEXT: --> {(4 + %start),+,4}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }683; CHECK-NEXT: Determining loop execution counts for: @test_ptr_aligned_by_4_via_assumption_multiple_loop_predecessors684; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.685; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.686; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.687; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)688; CHECK-NEXT: Predicates:689; CHECK-NEXT: Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0690; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903691; CHECK-NEXT: Predicates:692; CHECK-NEXT: Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0693; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-4 + (-1 * (ptrtoint ptr %start to i64)) + (ptrtoint ptr %end to i64)) /u 4)694; CHECK-NEXT: Predicates:695; CHECK-NEXT: Equal predicate: (zext i2 (-1 * (trunc i64 (ptrtoint ptr %start to i64) to i2)) to i64) == 0696;697entry:698 call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 2) ]699 call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 4) ]700 %c = call i1 @cond()701 br i1 %c, label %then, label %else702 703then:704 br label %loop705 706else:707 br label %loop708 709loop:710 %iv = phi ptr [ %start, %then] , [ %start, %else ], [ %iv.next, %loop ]711 store ptr %iv, ptr %iv712 %iv.next = getelementptr i8, ptr %iv, i64 4713 %ec = icmp ne ptr %iv.next, %end714 br i1 %ec, label %loop, label %exit715 716exit:717 ret void718}719 720define void @test_urem_non_constant(ptr %dst, i32 %a, i32 %b) {721; CHECK-LABEL: 'test_urem_non_constant'722; CHECK-NEXT: Classifying expressions for: @test_urem_non_constant723; CHECK-NEXT: %rem = urem i32 %a, %b724; CHECK-NEXT: --> ((-1 * (%a /u %b) * %b) + %a) U: full-set S: full-set725; CHECK-NEXT: %and.0 = and i1 %pre.0, %pre.1726; CHECK-NEXT: --> (%pre.1 umin %pre.0) U: full-set S: full-set727; CHECK-NEXT: %and.1 = and i1 %and.0, %pre.2728; CHECK-NEXT: --> (%pre.1 umin %pre.2 umin %pre.0) U: full-set S: full-set729; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]730; CHECK-NEXT: --> {0,+,%b}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }731; CHECK-NEXT: %gep.dst = getelementptr inbounds i8, ptr %dst, i32 %b732; CHECK-NEXT: --> ((sext i32 %b to i64) + %dst) U: full-set S: full-set Exits: ((sext i32 %b to i64) + %dst) LoopDispositions: { %loop: Invariant }733; CHECK-NEXT: %iv.next = add i32 %iv, %b734; CHECK-NEXT: --> {%b,+,%b}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }735; CHECK-NEXT: Determining loop execution counts for: @test_urem_non_constant736; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.737; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.738; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.739;740entry:741 %rem = urem i32 %a, %b742 %pre.0 = icmp eq i32 %rem, 0743 %pre.1 = icmp ne i32 %a, 0744 %pre.2 = icmp ne i32 %b, 0745 %and.0 = and i1 %pre.0, %pre.1746 %and.1 = and i1 %and.0, %pre.2747 br i1 %and.1, label %loop, label %exit748 749loop:750 %iv = phi i32 [ 0, %entry], [ %iv.next, %loop ]751 %gep.dst = getelementptr inbounds i8, ptr %dst, i32 %b752 store i8 0, ptr %gep.dst753 %iv.next = add i32 %iv, %b754 %ec = icmp ne i32 %iv.next, %a755 br i1 %ec, label %loop, label %exit756 757exit:758 ret void759}760 761declare void @llvm.assume(i1)762declare void @llvm.experimental.guard(i1, ...)763