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