brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · d692294 Raw
128 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 52; RUN: opt -passes="ipsccp<func-spec>" -funcspec-min-function-size=1       \3; RUN:                                 -funcspec-for-literal-constant=true \4; RUN:                                 -funcspec-min-codesize-savings=50   \5; RUN:                                 -funcspec-min-latency-savings=0     \6; RUN:                                 -S < %s | FileCheck %s7 8; Verify that we are able to estimate the codesize savings arising from a branch9; based on a comparison with a value found to have a constant range by IPSCCP.10define i32 @main() {11  %notspec = call i32 @test_use_on_lhs(i32 8)12  %spec1 = call i32 @test_use_on_lhs(i32 0)13  %spec2 = call i32 @test_use_on_rhs(i32 1)14  %sum1 = add i32 %notspec, %spec115  %sum2 = add i32 %sum1, %spec216  ret i32 %sum217}18 19define i32 @test_use_on_lhs(i32 %x) {20entry:21  %range = call i32 @foo(), !range !{ i32 1, i32 0 }22  %bound = shl nsw nuw i32 %range, 323  %cmp = icmp uge i32 %x, %bound24  br i1 %cmp, label %if.then, label %if.end25 26if.then:27  call void @do_something()28  call void @do_something()29  call void @do_something()30  call void @do_something()31  br label %if.end32 33if.end:34  %res = phi i32 [ 0, %entry ], [ 1, %if.then]35  ret i32 %res36}37 38define i32 @test_use_on_rhs(i32 %x) {39entry:40  %range = call i32 @foo(), !range !{ i32 1, i32 0 }41  %bound = shl nsw nuw i32 %range, 342  %x.sub = sub nsw nuw i32 %x, 143  %cmp = icmp ult i32 %bound, %x.sub44  br i1 %cmp, label %if.then, label %if.end45 46if.then:47  call void @do_something()48  call void @do_something()49  call void @do_something()50  call void @do_something()51  br label %if.end52 53if.end:54  %res = phi i32 [ 0, %entry ], [ 1, %if.then]55  ret i32 %res56}57 58declare i32 @foo()59declare void @do_something()60; CHECK-LABEL: define range(i32 0, 2) i32 @main() {61; CHECK-NEXT:    [[NOTSPEC:%.*]] = call i32 @test_use_on_lhs(i32 8)62; CHECK-NEXT:    [[SPEC1:%.*]] = call i32 @test_use_on_lhs.specialized.1(i32 0)63; CHECK-NEXT:    [[SPEC2:%.*]] = call i32 @test_use_on_rhs.specialized.2(i32 1)64; CHECK-NEXT:    [[SUM:%.*]] = add nuw nsw i32 [[NOTSPEC]], 065; CHECK-NEXT:    [[RES:%.*]] = add nuw nsw i32 [[SUM]], 066; CHECK-NEXT:    ret i32 [[RES]]67;68;69; CHECK-LABEL: define range(i32 0, 2) i32 @test_use_on_lhs(70; CHECK-SAME: i32 [[X:%.*]]) {71; CHECK-NEXT:  [[ENTRY:.*]]:72; CHECK-NEXT:    [[RANGE:%.*]] = call i32 @foo(), !range [[RNG0:![0-9]+]]73; CHECK-NEXT:    [[BOUND:%.*]] = shl nuw nsw i32 [[RANGE]], 374; CHECK-NEXT:    [[CMP:%.*]] = icmp uge i32 [[X]], [[BOUND]]75; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]76; CHECK:       [[IF_THEN]]:77; CHECK-NEXT:    call void @do_something()78; CHECK-NEXT:    call void @do_something()79; CHECK-NEXT:    call void @do_something()80; CHECK-NEXT:    call void @do_something()81; CHECK-NEXT:    br label %[[IF_END]]82; CHECK:       [[IF_END]]:83; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ 1, %[[IF_THEN]] ]84; CHECK-NEXT:    ret i32 [[RES]]85;86;87; CHECK-LABEL: define range(i32 0, 2) i32 @test_use_on_rhs(88; CHECK-SAME: i32 [[X:%.*]]) {89; CHECK-NEXT:  [[ENTRY:.*]]:90; CHECK-NEXT:    [[RANGE:%.*]] = call i32 @foo(), !range [[RNG0]]91; CHECK-NEXT:    [[BOUND:%.*]] = shl nuw nsw i32 [[RANGE]], 392; CHECK-NEXT:    [[X_SUB:%.*]] = sub nuw nsw i32 [[X]], 193; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[BOUND]], [[X_SUB]]94; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]95; CHECK:       [[IF_THEN]]:96; CHECK-NEXT:    call void @do_something()97; CHECK-NEXT:    call void @do_something()98; CHECK-NEXT:    call void @do_something()99; CHECK-NEXT:    call void @do_something()100; CHECK-NEXT:    br label %[[IF_END]]101; CHECK:       [[IF_END]]:102; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ 1, %[[IF_THEN]] ]103; CHECK-NEXT:    ret i32 [[RES]]104;105;106; CHECK-LABEL: define internal i32 @test_use_on_lhs.specialized.1(107; CHECK-SAME: i32 [[X:%.*]]) {108; CHECK-NEXT:  [[ENTRY:.*:]]109; CHECK-NEXT:    [[RANGE:%.*]] = call i32 @foo(), !range [[RNG0]]110; CHECK-NEXT:    [[BOUND:%.*]] = shl nuw nsw i32 [[RANGE]], 3111; CHECK-NEXT:    br label %[[IF_END:.*]]112; CHECK:       [[IF_END]]:113; CHECK-NEXT:    ret i32 poison114;115;116; CHECK-LABEL: define internal i32 @test_use_on_rhs.specialized.2(117; CHECK-SAME: i32 [[X:%.*]]) {118; CHECK-NEXT:  [[ENTRY:.*:]]119; CHECK-NEXT:    [[RANGE:%.*]] = call i32 @foo(), !range [[RNG0]]120; CHECK-NEXT:    [[BOUND:%.*]] = shl nuw nsw i32 [[RANGE]], 3121; CHECK-NEXT:    br label %[[IF_END:.*]]122; CHECK:       [[IF_END]]:123; CHECK-NEXT:    ret i32 poison124;125;.126; CHECK: [[RNG0]] = !{i32 1, i32 0}127;.128