165 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2;RUN: opt < %s -passes=jump-threading -S | FileCheck %s3 4 5declare void @bar(...)6declare void @baz(...)7 8; Make sure we thread the end of the bar block to the end of the function.9define void @test1(i32 %x) {10; CHECK-LABEL: @test1(11; CHECK-NEXT: entry:12; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], 913; CHECK-NEXT: br i1 [[CMP]], label [[IF_END_THREAD:%.*]], label [[IF_END:%.*]]14; CHECK: if.end.thread:15; CHECK-NEXT: call void (...) @bar()16; CHECK-NEXT: br label [[IF_END4:%.*]]17; CHECK: if.end:18; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X]], -319; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X_OFF]], 520; CHECK-NEXT: br i1 [[TMP0]], label [[IF_THEN3:%.*]], label [[IF_END4]]21; CHECK: if.then3:22; CHECK-NEXT: call void (...) @baz()23; CHECK-NEXT: br label [[IF_END4]]24; CHECK: if.end4:25; CHECK-NEXT: ret void26;27entry:28 %cmp = icmp sgt i32 %x, 929 br i1 %cmp, label %if.then, label %if.end30 31if.then: ; preds = %entry32 call void (...) @bar()33 br label %if.end34 35if.end: ; preds = %if.then, %entry36 %x.off = add i32 %x, -337 %0 = icmp ult i32 %x.off, 538 br i1 %0, label %if.then3, label %if.end439 40if.then3: ; preds = %if.end41 call void (...) @baz()42 br label %if.end443 44if.end4: ; preds = %if.then3, %if.end45 ret void46}47 48; Make sure we thread the false side of the first if to the end of the function.49define void @test2(i32 %x) {50; CHECK-LABEL: @test2(51; CHECK-NEXT: entry:52; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 953; CHECK-NEXT: br i1 [[CMP]], label [[IF_END:%.*]], label [[IF_END4:%.*]]54; CHECK: if.end:55; CHECK-NEXT: call void (...) @bar()56; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X]], -357; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X_OFF]], 558; CHECK-NEXT: br i1 [[TMP0]], label [[IF_THEN3:%.*]], label [[IF_END4]]59; CHECK: if.then3:60; CHECK-NEXT: call void (...) @baz()61; CHECK-NEXT: br label [[IF_END4]]62; CHECK: if.end4:63; CHECK-NEXT: ret void64;65entry:66 %cmp = icmp slt i32 %x, 967 br i1 %cmp, label %if.then, label %if.end68 69if.then: ; preds = %entry70 call void (...) @bar()71 br label %if.end72 73if.end: ; preds = %if.then, %entry74 %x.off = add i32 %x, -375 %0 = icmp ult i32 %x.off, 576 br i1 %0, label %if.then3, label %if.end477 78if.then3: ; preds = %if.end79 call void (...) @baz()80 br label %if.end481 82if.end4: ; preds = %if.then3, %if.end83 ret void84}85 86; Negative test to make sure we don't thread when the ranges overlap.87define void @test3(i32 %x) {88; CHECK-LABEL: @test3(89; CHECK-NEXT: entry:90; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], 691; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]92; CHECK: if.then:93; CHECK-NEXT: call void (...) @bar()94; CHECK-NEXT: br label [[IF_END]]95; CHECK: if.end:96; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X]], -397; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X_OFF]], 598; CHECK-NEXT: br i1 [[TMP0]], label [[IF_THEN3:%.*]], label [[IF_END4:%.*]]99; CHECK: if.then3:100; CHECK-NEXT: call void (...) @baz()101; CHECK-NEXT: br label [[IF_END4]]102; CHECK: if.end4:103; CHECK-NEXT: ret void104;105entry:106 %cmp = icmp sgt i32 %x, 6107 br i1 %cmp, label %if.then, label %if.end108 109if.then: ; preds = %entry110 call void (...) @bar()111 br label %if.end112 113if.end: ; preds = %if.then, %entry114 %x.off = add i32 %x, -3115 %0 = icmp ult i32 %x.off, 5116 br i1 %0, label %if.then3, label %if.end4117 118if.then3: ; preds = %if.end119 call void (...) @baz()120 br label %if.end4121 122if.end4: ; preds = %if.then3, %if.end123 ret void124}125 126; Make sure we thread the false side of the first if to the end of the function127; (case with non-local comparisions).128define void @test4(i32 %x) {129; CHECK-LABEL: @test4(130; CHECK-NEXT: entry:131; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[X:%.*]], 9132; CHECK-NEXT: [[X_OFF:%.*]] = add i32 [[X]], -3133; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[X_OFF]], 5134; CHECK-NEXT: br i1 [[CMP1]], label [[IF_END:%.*]], label [[IF_END4:%.*]]135; CHECK: if.end:136; CHECK-NEXT: call void (...) @bar()137; CHECK-NEXT: br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END4]]138; CHECK: if.then3:139; CHECK-NEXT: call void (...) @baz()140; CHECK-NEXT: br label [[IF_END4]]141; CHECK: if.end4:142; CHECK-NEXT: ret void143;144entry:145 %cmp1 = icmp slt i32 %x, 9146 %x.off = add i32 %x, -3147 %cmp2 = icmp ult i32 %x.off, 5148 br i1 %cmp1, label %if.then, label %if.end149 150if.then: ; preds = %entry151 call void (...) @bar()152 br label %if.end153 154if.end: ; preds = %if.then, %entry155 br i1 %cmp2, label %if.then3, label %if.end4156 157if.then3: ; preds = %if.end158 call void (...) @baz()159 br label %if.end4160 161if.end4: ; preds = %if.then3, %if.end162 ret void163}164 165