brintos

brintos / llvm-project-archived public Read only

0
0
Text · 58.4 KiB · d72a956 Raw
999 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -select-optimize -mtriple=aarch64-linux-gnu -mcpu=generic -S < %s | FileCheck %s --check-prefix=CHECKOO3; RUN: opt -select-optimize -mtriple=aarch64-linux-gnu -mcpu=cortex-a55 -S < %s | FileCheck %s --check-prefix=CHECKII4; RUN: opt -select-optimize -mtriple=aarch64-linux-gnu -mcpu=cortex-a510 -S < %s | FileCheck %s --check-prefix=CHECKII5; RUN: opt -select-optimize -mtriple=aarch64-linux-gnu -mcpu=cortex-a72 -S < %s | FileCheck %s --check-prefix=CHECKOO6; RUN: opt -select-optimize -mtriple=aarch64-linux-gnu -mcpu=neoverse-n1 -S < %s | FileCheck %s --check-prefix=CHECKOO7; RUN: opt -select-optimize -mtriple=aarch64-linux-gnu -mcpu=cortex-a710 -S < %s | FileCheck %s --check-prefix=CHECKOO8; RUN: opt -select-optimize -mtriple=aarch64-linux-gnu -mcpu=neoverse-v2 -S < %s | FileCheck %s --check-prefix=CHECKOO9; RUN: opt -debugify-and-strip-all-safe -select-optimize -mtriple=aarch64-linux-gnu -mcpu=generic -S < %s | FileCheck %s --check-prefix=CHECKOO10; RUN: opt -passes='require<profile-summary>,function(select-optimize)' -mtriple=aarch64-linux-gnu -mcpu=generic -S < %s | FileCheck %s --check-prefix=CHECKOO11; RUN: opt -passes='require<profile-summary>,function(select-optimize)' -mtriple=aarch64-linux-gnu -mcpu=cortex-a55 -S < %s | FileCheck %s --check-prefix=CHECKII12; RUN: opt -passes='require<profile-summary>,function(select-optimize)' -mtriple=aarch64-linux-gnu -mcpu=cortex-a510 -S < %s | FileCheck %s --check-prefix=CHECKII13; RUN: opt -passes='require<profile-summary>,function(select-optimize)' -mtriple=aarch64-linux-gnu -mcpu=cortex-a72 -S < %s | FileCheck %s --check-prefix=CHECKOO14; RUN: opt -passes='require<profile-summary>,function(select-optimize)' -mtriple=aarch64-linux-gnu -mcpu=neoverse-n1 -S < %s | FileCheck %s --check-prefix=CHECKOO15; RUN: opt -passes='require<profile-summary>,function(select-optimize)' -mtriple=aarch64-linux-gnu -mcpu=cortex-a710 -S < %s | FileCheck %s --check-prefix=CHECKOO16; RUN: opt -passes='require<profile-summary>,function(select-optimize)' -mtriple=aarch64-linux-gnu -mcpu=neoverse-v2 -S < %s | FileCheck %s --check-prefix=CHECKOO17 18%struct.st = type { i32, i64, ptr, ptr, i16, ptr, ptr, i64, i64 }19 20; This test has a select at the end of if.then, which is better transformed to a branch on OoO cores.21 22define void @replace(ptr nocapture noundef %newst, ptr noundef %t, ptr noundef %h, i64 noundef %c, i64 noundef %rc, i64 noundef %ma, i64 noundef %n) {23; CHECKOO-LABEL: @replace(24; CHECKOO-NEXT:  entry:25; CHECKOO-NEXT:    [[T1:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[NEWST:%.*]], i64 0, i32 226; CHECKOO-NEXT:    store ptr [[T:%.*]], ptr [[T1]], align 827; CHECKOO-NEXT:    [[H3:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 328; CHECKOO-NEXT:    store ptr [[H:%.*]], ptr [[H3]], align 829; CHECKOO-NEXT:    [[ORG_C:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 830; CHECKOO-NEXT:    store i64 [[C:%.*]], ptr [[ORG_C]], align 831; CHECKOO-NEXT:    [[C6:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 132; CHECKOO-NEXT:    store i64 [[C]], ptr [[C6]], align 833; CHECKOO-NEXT:    [[FLOW:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 734; CHECKOO-NEXT:    store i64 [[RC:%.*]], ptr [[FLOW]], align 835; CHECKOO-NEXT:    [[CONV:%.*]] = trunc i64 [[N:%.*]] to i3236; CHECKOO-NEXT:    store i32 [[CONV]], ptr [[NEWST]], align 837; CHECKOO-NEXT:    [[FLOW10:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 1, i32 738; CHECKOO-NEXT:    [[TMP0:%.*]] = load i64, ptr [[FLOW10]], align 839; CHECKOO-NEXT:    [[FLOW12:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 2, i32 740; CHECKOO-NEXT:    [[TMP1:%.*]] = load i64, ptr [[FLOW12]], align 841; CHECKOO-NEXT:    [[CMP13:%.*]] = icmp sgt i64 [[TMP0]], [[TMP1]]42; CHECKOO-NEXT:    [[CONV15:%.*]] = select i1 [[CMP13]], i64 2, i64 343; CHECKOO-NEXT:    [[CMP16_NOT149:%.*]] = icmp sgt i64 [[CONV15]], [[MA:%.*]]44; CHECKOO-NEXT:    br i1 [[CMP16_NOT149]], label [[WHILE_END:%.*]], label [[LAND_RHS:%.*]]45; CHECKOO:       land.rhs:46; CHECKOO-NEXT:    [[CMP_0151:%.*]] = phi i64 [ [[CMP_1:%.*]], [[IF_END87:%.*]] ], [ [[CONV15]], [[ENTRY:%.*]] ]47; CHECKOO-NEXT:    [[POS_0150:%.*]] = phi i64 [ [[CMP_0151]], [[IF_END87]] ], [ 1, [[ENTRY]] ]48; CHECKOO-NEXT:    [[SUB:%.*]] = add nsw i64 [[CMP_0151]], -149; CHECKOO-NEXT:    [[FLOW19:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 750; CHECKOO-NEXT:    [[TMP2:%.*]] = load i64, ptr [[FLOW19]], align 851; CHECKOO-NEXT:    [[CMP20:%.*]] = icmp sgt i64 [[TMP2]], [[RC]]52; CHECKOO-NEXT:    br i1 [[CMP20]], label [[WHILE_BODY:%.*]], label [[WHILE_END]]53; CHECKOO:       while.body:54; CHECKOO-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]]55; CHECKOO-NEXT:    [[T24:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 256; CHECKOO-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[T24]], align 857; CHECKOO-NEXT:    [[SUB25:%.*]] = add nsw i64 [[POS_0150]], -158; CHECKOO-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]]59; CHECKOO-NEXT:    [[T27:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 260; CHECKOO-NEXT:    store ptr [[TMP3]], ptr [[T27]], align 861; CHECKOO-NEXT:    [[H30:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 362; CHECKOO-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[H30]], align 863; CHECKOO-NEXT:    [[H33:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 364; CHECKOO-NEXT:    store ptr [[TMP4]], ptr [[H33]], align 865; CHECKOO-NEXT:    [[C36:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 166; CHECKOO-NEXT:    [[TMP5:%.*]] = load i64, ptr [[C36]], align 867; CHECKOO-NEXT:    [[C39:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 168; CHECKOO-NEXT:    store i64 [[TMP5]], ptr [[C39]], align 869; CHECKOO-NEXT:    [[TMP6:%.*]] = load i64, ptr [[C36]], align 870; CHECKOO-NEXT:    [[ORG_C45:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 871; CHECKOO-NEXT:    store i64 [[TMP6]], ptr [[ORG_C45]], align 872; CHECKOO-NEXT:    [[FLOW51:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 773; CHECKOO-NEXT:    store i64 [[TMP2]], ptr [[FLOW51]], align 874; CHECKOO-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX18]], align 875; CHECKOO-NEXT:    store i32 [[TMP7]], ptr [[ARRAYIDX26]], align 876; CHECKOO-NEXT:    store ptr [[T]], ptr [[T24]], align 877; CHECKOO-NEXT:    store ptr [[H]], ptr [[H30]], align 878; CHECKOO-NEXT:    store i64 [[C]], ptr [[C36]], align 879; CHECKOO-NEXT:    [[ORG_C69:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 880; CHECKOO-NEXT:    store i64 [[C]], ptr [[ORG_C69]], align 881; CHECKOO-NEXT:    store i64 [[RC]], ptr [[FLOW19]], align 882; CHECKOO-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX18]], align 883; CHECKOO-NEXT:    [[MUL:%.*]] = shl nsw i64 [[CMP_0151]], 184; CHECKOO-NEXT:    [[ADD:%.*]] = or i64 [[MUL]], 185; CHECKOO-NEXT:    [[CMP77_NOT:%.*]] = icmp sgt i64 [[ADD]], [[MA]]86; CHECKOO-NEXT:    br i1 [[CMP77_NOT]], label [[IF_END87]], label [[IF_THEN:%.*]]87; CHECKOO:       if.then:88; CHECKOO-NEXT:    [[SUB79:%.*]] = add nsw i64 [[MUL]], -189; CHECKOO-NEXT:    [[FLOW81:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB79]], i32 790; CHECKOO-NEXT:    [[TMP8:%.*]] = load i64, ptr [[FLOW81]], align 891; CHECKOO-NEXT:    [[FLOW83:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[MUL]], i32 792; CHECKOO-NEXT:    [[TMP9:%.*]] = load i64, ptr [[FLOW83]], align 893; CHECKOO-NEXT:    [[CMP84:%.*]] = icmp slt i64 [[TMP8]], [[TMP9]]94; CHECKOO-NEXT:    [[SPEC_SELECT_FROZEN:%.*]] = freeze i1 [[CMP84]]95; CHECKOO-NEXT:    br i1 [[SPEC_SELECT_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]96; CHECKOO:       select.false:97; CHECKOO-NEXT:    br label [[SELECT_END]]98; CHECKOO:       select.end:99; CHECKOO-NEXT:    [[SPEC_SELECT:%.*]] = phi i64 [ [[ADD]], [[IF_THEN]] ], [ [[MUL]], [[SELECT_FALSE]] ]100; CHECKOO-NEXT:    br label [[IF_END87]]101; CHECKOO:       if.end87:102; CHECKOO-NEXT:    [[CMP_1]] = phi i64 [ [[MUL]], [[WHILE_BODY]] ], [ [[SPEC_SELECT]], [[SELECT_END]] ]103; CHECKOO-NEXT:    [[CMP16_NOT:%.*]] = icmp sgt i64 [[CMP_1]], [[MA]]104; CHECKOO-NEXT:    br i1 [[CMP16_NOT]], label [[WHILE_END]], label [[LAND_RHS]]105; CHECKOO:       while.end:106; CHECKOO-NEXT:    ret void107;108; CHECKII-LABEL: @replace(109; CHECKII-NEXT:  entry:110; CHECKII-NEXT:    [[T1:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[NEWST:%.*]], i64 0, i32 2111; CHECKII-NEXT:    store ptr [[T:%.*]], ptr [[T1]], align 8112; CHECKII-NEXT:    [[H3:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 3113; CHECKII-NEXT:    store ptr [[H:%.*]], ptr [[H3]], align 8114; CHECKII-NEXT:    [[ORG_C:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 8115; CHECKII-NEXT:    store i64 [[C:%.*]], ptr [[ORG_C]], align 8116; CHECKII-NEXT:    [[C6:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 1117; CHECKII-NEXT:    store i64 [[C]], ptr [[C6]], align 8118; CHECKII-NEXT:    [[FLOW:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 7119; CHECKII-NEXT:    store i64 [[RC:%.*]], ptr [[FLOW]], align 8120; CHECKII-NEXT:    [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32121; CHECKII-NEXT:    store i32 [[CONV]], ptr [[NEWST]], align 8122; CHECKII-NEXT:    [[FLOW10:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 1, i32 7123; CHECKII-NEXT:    [[TMP0:%.*]] = load i64, ptr [[FLOW10]], align 8124; CHECKII-NEXT:    [[FLOW12:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 2, i32 7125; CHECKII-NEXT:    [[TMP1:%.*]] = load i64, ptr [[FLOW12]], align 8126; CHECKII-NEXT:    [[CMP13:%.*]] = icmp sgt i64 [[TMP0]], [[TMP1]]127; CHECKII-NEXT:    [[CONV15:%.*]] = select i1 [[CMP13]], i64 2, i64 3128; CHECKII-NEXT:    [[CMP16_NOT149:%.*]] = icmp sgt i64 [[CONV15]], [[MA:%.*]]129; CHECKII-NEXT:    br i1 [[CMP16_NOT149]], label [[WHILE_END:%.*]], label [[LAND_RHS:%.*]]130; CHECKII:       land.rhs:131; CHECKII-NEXT:    [[CMP_0151:%.*]] = phi i64 [ [[CMP_1:%.*]], [[IF_END87:%.*]] ], [ [[CONV15]], [[ENTRY:%.*]] ]132; CHECKII-NEXT:    [[POS_0150:%.*]] = phi i64 [ [[CMP_0151]], [[IF_END87]] ], [ 1, [[ENTRY]] ]133; CHECKII-NEXT:    [[SUB:%.*]] = add nsw i64 [[CMP_0151]], -1134; CHECKII-NEXT:    [[FLOW19:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 7135; CHECKII-NEXT:    [[TMP2:%.*]] = load i64, ptr [[FLOW19]], align 8136; CHECKII-NEXT:    [[CMP20:%.*]] = icmp sgt i64 [[TMP2]], [[RC]]137; CHECKII-NEXT:    br i1 [[CMP20]], label [[WHILE_BODY:%.*]], label [[WHILE_END]]138; CHECKII:       while.body:139; CHECKII-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]]140; CHECKII-NEXT:    [[T24:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 2141; CHECKII-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[T24]], align 8142; CHECKII-NEXT:    [[SUB25:%.*]] = add nsw i64 [[POS_0150]], -1143; CHECKII-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]]144; CHECKII-NEXT:    [[T27:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 2145; CHECKII-NEXT:    store ptr [[TMP3]], ptr [[T27]], align 8146; CHECKII-NEXT:    [[H30:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 3147; CHECKII-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[H30]], align 8148; CHECKII-NEXT:    [[H33:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 3149; CHECKII-NEXT:    store ptr [[TMP4]], ptr [[H33]], align 8150; CHECKII-NEXT:    [[C36:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 1151; CHECKII-NEXT:    [[TMP5:%.*]] = load i64, ptr [[C36]], align 8152; CHECKII-NEXT:    [[C39:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 1153; CHECKII-NEXT:    store i64 [[TMP5]], ptr [[C39]], align 8154; CHECKII-NEXT:    [[TMP6:%.*]] = load i64, ptr [[C36]], align 8155; CHECKII-NEXT:    [[ORG_C45:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 8156; CHECKII-NEXT:    store i64 [[TMP6]], ptr [[ORG_C45]], align 8157; CHECKII-NEXT:    [[FLOW51:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 7158; CHECKII-NEXT:    store i64 [[TMP2]], ptr [[FLOW51]], align 8159; CHECKII-NEXT:    [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX18]], align 8160; CHECKII-NEXT:    store i32 [[TMP7]], ptr [[ARRAYIDX26]], align 8161; CHECKII-NEXT:    store ptr [[T]], ptr [[T24]], align 8162; CHECKII-NEXT:    store ptr [[H]], ptr [[H30]], align 8163; CHECKII-NEXT:    store i64 [[C]], ptr [[C36]], align 8164; CHECKII-NEXT:    [[ORG_C69:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 8165; CHECKII-NEXT:    store i64 [[C]], ptr [[ORG_C69]], align 8166; CHECKII-NEXT:    store i64 [[RC]], ptr [[FLOW19]], align 8167; CHECKII-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX18]], align 8168; CHECKII-NEXT:    [[MUL:%.*]] = shl nsw i64 [[CMP_0151]], 1169; CHECKII-NEXT:    [[ADD:%.*]] = or i64 [[MUL]], 1170; CHECKII-NEXT:    [[CMP77_NOT:%.*]] = icmp sgt i64 [[ADD]], [[MA]]171; CHECKII-NEXT:    br i1 [[CMP77_NOT]], label [[IF_END87]], label [[IF_THEN:%.*]]172; CHECKII:       if.then:173; CHECKII-NEXT:    [[SUB79:%.*]] = add nsw i64 [[MUL]], -1174; CHECKII-NEXT:    [[FLOW81:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB79]], i32 7175; CHECKII-NEXT:    [[TMP8:%.*]] = load i64, ptr [[FLOW81]], align 8176; CHECKII-NEXT:    [[FLOW83:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[MUL]], i32 7177; CHECKII-NEXT:    [[TMP9:%.*]] = load i64, ptr [[FLOW83]], align 8178; CHECKII-NEXT:    [[CMP84:%.*]] = icmp slt i64 [[TMP8]], [[TMP9]]179; CHECKII-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP84]], i64 [[ADD]], i64 [[MUL]]180; CHECKII-NEXT:    br label [[IF_END87]]181; CHECKII:       if.end87:182; CHECKII-NEXT:    [[CMP_1]] = phi i64 [ [[MUL]], [[WHILE_BODY]] ], [ [[SPEC_SELECT]], [[IF_THEN]] ]183; CHECKII-NEXT:    [[CMP16_NOT:%.*]] = icmp sgt i64 [[CMP_1]], [[MA]]184; CHECKII-NEXT:    br i1 [[CMP16_NOT]], label [[WHILE_END]], label [[LAND_RHS]]185; CHECKII:       while.end:186; CHECKII-NEXT:    ret void187;188entry:189  %t1 = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 2190  store ptr %t, ptr %t1, align 8191  %h3 = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 3192  store ptr %h, ptr %h3, align 8193  %org_c = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 8194  store i64 %c, ptr %org_c, align 8195  %c6 = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 1196  store i64 %c, ptr %c6, align 8197  %flow = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 7198  store i64 %rc, ptr %flow, align 8199  %conv = trunc i64 %n to i32200  store i32 %conv, ptr %newst, align 8201  %flow10 = getelementptr inbounds %struct.st, ptr %newst, i64 1, i32 7202  %0 = load i64, ptr %flow10, align 8203  %flow12 = getelementptr inbounds %struct.st, ptr %newst, i64 2, i32 7204  %1 = load i64, ptr %flow12, align 8205  %cmp13 = icmp sgt i64 %0, %1206  %conv15 = select i1 %cmp13, i64 2, i64 3207  %cmp16.not149 = icmp sgt i64 %conv15, %ma208  br i1 %cmp16.not149, label %while.end, label %land.rhs209 210land.rhs:                                         ; preds = %entry, %if.end87211  %cmp.0151 = phi i64 [ %cmp.1, %if.end87 ], [ %conv15, %entry ]212  %pos.0150 = phi i64 [ %cmp.0151, %if.end87 ], [ 1, %entry ]213  %sub = add nsw i64 %cmp.0151, -1214  %flow19 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 7215  %2 = load i64, ptr %flow19, align 8216  %cmp20 = icmp sgt i64 %2, %rc217  br i1 %cmp20, label %while.body, label %while.end218 219while.body:                                       ; preds = %land.rhs220  %arrayidx18 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub221  %t24 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 2222  %3 = load ptr, ptr %t24, align 8223  %sub25 = add nsw i64 %pos.0150, -1224  %arrayidx26 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25225  %t27 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 2226  store ptr %3, ptr %t27, align 8227  %h30 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 3228  %4 = load ptr, ptr %h30, align 8229  %h33 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 3230  store ptr %4, ptr %h33, align 8231  %c36 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 1232  %5 = load i64, ptr %c36, align 8233  %c39 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 1234  store i64 %5, ptr %c39, align 8235  %6 = load i64, ptr %c36, align 8236  %org_c45 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 8237  store i64 %6, ptr %org_c45, align 8238  %flow51 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 7239  store i64 %2, ptr %flow51, align 8240  %7 = load i32, ptr %arrayidx18, align 8241  store i32 %7, ptr %arrayidx26, align 8242  store ptr %t, ptr %t24, align 8243  store ptr %h, ptr %h30, align 8244  store i64 %c, ptr %c36, align 8245  %org_c69 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 8246  store i64 %c, ptr %org_c69, align 8247  store i64 %rc, ptr %flow19, align 8248  store i32 %conv, ptr %arrayidx18, align 8249  %mul = shl nsw i64 %cmp.0151, 1250  %add = or i64 %mul, 1251  %cmp77.not = icmp sgt i64 %add, %ma252  br i1 %cmp77.not, label %if.end87, label %if.then253 254if.then:                                          ; preds = %while.body255  %sub79 = add nsw i64 %mul, -1256  %flow81 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub79, i32 7257  %8 = load i64, ptr %flow81, align 8258  %flow83 = getelementptr inbounds %struct.st, ptr %newst, i64 %mul, i32 7259  %9 = load i64, ptr %flow83, align 8260  %cmp84 = icmp slt i64 %8, %9261  %spec.select = select i1 %cmp84, i64 %add, i64 %mul262  br label %if.end87263 264if.end87:                                         ; preds = %if.then, %while.body265  %cmp.1 = phi i64 [ %mul, %while.body ], [ %spec.select, %if.then ]266  %cmp16.not = icmp sgt i64 %cmp.1, %ma267  br i1 %cmp16.not, label %while.end, label %land.rhs268 269while.end:                                        ; preds = %land.rhs, %if.end87, %entry270  ret void271}272 273 274define void @replace_or(ptr nocapture noundef %newst, ptr noundef %t, ptr noundef %h, i64 noundef %c, i64 noundef %rc, i64 noundef %ma, i64 noundef %n) {275; CHECKOO-LABEL: @replace_or(276; CHECKOO-NEXT:  entry:277; CHECKOO-NEXT:    [[T1:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[NEWST:%.*]], i64 0, i32 2278; CHECKOO-NEXT:    store ptr [[T:%.*]], ptr [[T1]], align 8279; CHECKOO-NEXT:    [[H3:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 3280; CHECKOO-NEXT:    store ptr [[H:%.*]], ptr [[H3]], align 8281; CHECKOO-NEXT:    [[ORG_C:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 8282; CHECKOO-NEXT:    store i64 [[C:%.*]], ptr [[ORG_C]], align 8283; CHECKOO-NEXT:    [[C6:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 1284; CHECKOO-NEXT:    store i64 [[C]], ptr [[C6]], align 8285; CHECKOO-NEXT:    [[FLOW:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 7286; CHECKOO-NEXT:    store i64 [[RC:%.*]], ptr [[FLOW]], align 8287; CHECKOO-NEXT:    [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32288; CHECKOO-NEXT:    store i32 [[CONV]], ptr [[NEWST]], align 8289; CHECKOO-NEXT:    [[FLOW10:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 1, i32 7290; CHECKOO-NEXT:    [[TMP0:%.*]] = load i64, ptr [[FLOW10]], align 8291; CHECKOO-NEXT:    [[FLOW12:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 2, i32 7292; CHECKOO-NEXT:    [[TMP1:%.*]] = load i64, ptr [[FLOW12]], align 8293; CHECKOO-NEXT:    [[CMP13:%.*]] = icmp sgt i64 [[TMP0]], [[TMP1]]294; CHECKOO-NEXT:    [[CONV15:%.*]] = select i1 [[CMP13]], i64 2, i64 3295; CHECKOO-NEXT:    [[CMP16_NOT149:%.*]] = icmp sgt i64 [[CONV15]], [[MA:%.*]]296; CHECKOO-NEXT:    br i1 [[CMP16_NOT149]], label [[WHILE_END:%.*]], label [[LAND_RHS:%.*]]297; CHECKOO:       land.rhs:298; CHECKOO-NEXT:    [[CMP_0151:%.*]] = phi i64 [ [[CMP_1:%.*]], [[IF_END87:%.*]] ], [ [[CONV15]], [[ENTRY:%.*]] ]299; CHECKOO-NEXT:    [[POS_0150:%.*]] = phi i64 [ [[CMP_0151]], [[IF_END87]] ], [ 1, [[ENTRY]] ]300; CHECKOO-NEXT:    [[SUB:%.*]] = add nsw i64 [[CMP_0151]], -1301; CHECKOO-NEXT:    [[FLOW19:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 7302; CHECKOO-NEXT:    [[TMP2:%.*]] = load i64, ptr [[FLOW19]], align 8303; CHECKOO-NEXT:    [[CMP20:%.*]] = icmp sgt i64 [[TMP2]], [[RC]]304; CHECKOO-NEXT:    br i1 [[CMP20]], label [[WHILE_BODY:%.*]], label [[WHILE_END]]305; CHECKOO:       while.body:306; CHECKOO-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]]307; CHECKOO-NEXT:    [[T24:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 2308; CHECKOO-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[T24]], align 8309; CHECKOO-NEXT:    [[SUB25:%.*]] = add nsw i64 [[POS_0150]], -1310; CHECKOO-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]]311; CHECKOO-NEXT:    [[T27:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 2312; CHECKOO-NEXT:    store ptr [[TMP3]], ptr [[T27]], align 8313; CHECKOO-NEXT:    [[H30:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 3314; CHECKOO-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[H30]], align 8315; CHECKOO-NEXT:    [[H33:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 3316; CHECKOO-NEXT:    store ptr [[TMP4]], ptr [[H33]], align 8317; CHECKOO-NEXT:    [[C36:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 1318; CHECKOO-NEXT:    [[TMP5:%.*]] = load i64, ptr [[C36]], align 8319; CHECKOO-NEXT:    [[C39:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 1320; CHECKOO-NEXT:    store i64 [[TMP5]], ptr [[C39]], align 8321; CHECKOO-NEXT:    [[ORG_C45:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 8322; CHECKOO-NEXT:    store i64 [[TMP5]], ptr [[ORG_C45]], align 8323; CHECKOO-NEXT:    [[FLOW51:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 7324; CHECKOO-NEXT:    store i64 [[TMP2]], ptr [[FLOW51]], align 8325; CHECKOO-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX18]], align 8326; CHECKOO-NEXT:    store i32 [[TMP6]], ptr [[ARRAYIDX26]], align 8327; CHECKOO-NEXT:    store ptr [[T]], ptr [[T24]], align 8328; CHECKOO-NEXT:    store ptr [[H]], ptr [[H30]], align 8329; CHECKOO-NEXT:    store i64 [[C]], ptr [[C36]], align 8330; CHECKOO-NEXT:    [[ORG_C69:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 8331; CHECKOO-NEXT:    store i64 [[C]], ptr [[ORG_C69]], align 8332; CHECKOO-NEXT:    store i64 [[RC]], ptr [[FLOW19]], align 8333; CHECKOO-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX18]], align 8334; CHECKOO-NEXT:    [[MUL:%.*]] = shl nsw i64 [[CMP_0151]], 1335; CHECKOO-NEXT:    [[CMP77_NOT_NOT:%.*]] = icmp slt i64 [[MUL]], [[MA]]336; CHECKOO-NEXT:    br i1 [[CMP77_NOT_NOT]], label [[IF_THEN:%.*]], label [[IF_END87]]337; CHECKOO:       if.then:338; CHECKOO-NEXT:    [[SUB79:%.*]] = add nsw i64 [[MUL]], -1339; CHECKOO-NEXT:    [[FLOW81:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB79]], i32 7340; CHECKOO-NEXT:    [[TMP7:%.*]] = load i64, ptr [[FLOW81]], align 8341; CHECKOO-NEXT:    [[FLOW83:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[MUL]], i32 7342; CHECKOO-NEXT:    [[TMP8:%.*]] = load i64, ptr [[FLOW83]], align 8343; CHECKOO-NEXT:    [[CMP84:%.*]] = icmp slt i64 [[TMP7]], [[TMP8]]344; CHECKOO-NEXT:    [[ADD:%.*]] = zext i1 [[CMP84]] to i64345; CHECKOO-NEXT:    [[CMP84_FROZEN:%.*]] = freeze i1 [[CMP84]]346; CHECKOO-NEXT:    br i1 [[CMP84_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]347; CHECKOO:       select.true.sink:348; CHECKOO-NEXT:    [[TMP9:%.*]] = or disjoint i64 [[MUL]], 1349; CHECKOO-NEXT:    br label [[SELECT_FALSE]]350; CHECKOO:       select.end:351; CHECKOO-NEXT:    [[SPEC_SELECT:%.*]] = phi i64 [ [[TMP9]], [[SELECT_END]] ], [ [[MUL]], [[IF_THEN]] ]352; CHECKOO-NEXT:    br label [[IF_END87]]353; CHECKOO:       if.end87:354; CHECKOO-NEXT:    [[CMP_1]] = phi i64 [ [[MUL]], [[WHILE_BODY]] ], [ [[SPEC_SELECT]], [[SELECT_FALSE]] ]355; CHECKOO-NEXT:    [[CMP16_NOT:%.*]] = icmp sgt i64 [[CMP_1]], [[MA]]356; CHECKOO-NEXT:    br i1 [[CMP16_NOT]], label [[WHILE_END]], label [[LAND_RHS]]357; CHECKOO:       while.end:358; CHECKOO-NEXT:    ret void359;360; CHECKII-LABEL: @replace_or(361; CHECKII-NEXT:  entry:362; CHECKII-NEXT:    [[T1:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], ptr [[NEWST:%.*]], i64 0, i32 2363; CHECKII-NEXT:    store ptr [[T:%.*]], ptr [[T1]], align 8364; CHECKII-NEXT:    [[H3:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 3365; CHECKII-NEXT:    store ptr [[H:%.*]], ptr [[H3]], align 8366; CHECKII-NEXT:    [[ORG_C:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 8367; CHECKII-NEXT:    store i64 [[C:%.*]], ptr [[ORG_C]], align 8368; CHECKII-NEXT:    [[C6:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 1369; CHECKII-NEXT:    store i64 [[C]], ptr [[C6]], align 8370; CHECKII-NEXT:    [[FLOW:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 0, i32 7371; CHECKII-NEXT:    store i64 [[RC:%.*]], ptr [[FLOW]], align 8372; CHECKII-NEXT:    [[CONV:%.*]] = trunc i64 [[N:%.*]] to i32373; CHECKII-NEXT:    store i32 [[CONV]], ptr [[NEWST]], align 8374; CHECKII-NEXT:    [[FLOW10:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 1, i32 7375; CHECKII-NEXT:    [[TMP0:%.*]] = load i64, ptr [[FLOW10]], align 8376; CHECKII-NEXT:    [[FLOW12:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 2, i32 7377; CHECKII-NEXT:    [[TMP1:%.*]] = load i64, ptr [[FLOW12]], align 8378; CHECKII-NEXT:    [[CMP13:%.*]] = icmp sgt i64 [[TMP0]], [[TMP1]]379; CHECKII-NEXT:    [[CONV15:%.*]] = select i1 [[CMP13]], i64 2, i64 3380; CHECKII-NEXT:    [[CMP16_NOT149:%.*]] = icmp sgt i64 [[CONV15]], [[MA:%.*]]381; CHECKII-NEXT:    br i1 [[CMP16_NOT149]], label [[WHILE_END:%.*]], label [[LAND_RHS:%.*]]382; CHECKII:       land.rhs:383; CHECKII-NEXT:    [[CMP_0151:%.*]] = phi i64 [ [[CMP_1:%.*]], [[IF_END87:%.*]] ], [ [[CONV15]], [[ENTRY:%.*]] ]384; CHECKII-NEXT:    [[POS_0150:%.*]] = phi i64 [ [[CMP_0151]], [[IF_END87]] ], [ 1, [[ENTRY]] ]385; CHECKII-NEXT:    [[SUB:%.*]] = add nsw i64 [[CMP_0151]], -1386; CHECKII-NEXT:    [[FLOW19:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 7387; CHECKII-NEXT:    [[TMP2:%.*]] = load i64, ptr [[FLOW19]], align 8388; CHECKII-NEXT:    [[CMP20:%.*]] = icmp sgt i64 [[TMP2]], [[RC]]389; CHECKII-NEXT:    br i1 [[CMP20]], label [[WHILE_BODY:%.*]], label [[WHILE_END]]390; CHECKII:       while.body:391; CHECKII-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]]392; CHECKII-NEXT:    [[T24:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 2393; CHECKII-NEXT:    [[TMP3:%.*]] = load ptr, ptr [[T24]], align 8394; CHECKII-NEXT:    [[SUB25:%.*]] = add nsw i64 [[POS_0150]], -1395; CHECKII-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]]396; CHECKII-NEXT:    [[T27:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 2397; CHECKII-NEXT:    store ptr [[TMP3]], ptr [[T27]], align 8398; CHECKII-NEXT:    [[H30:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 3399; CHECKII-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[H30]], align 8400; CHECKII-NEXT:    [[H33:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 3401; CHECKII-NEXT:    store ptr [[TMP4]], ptr [[H33]], align 8402; CHECKII-NEXT:    [[C36:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 1403; CHECKII-NEXT:    [[TMP5:%.*]] = load i64, ptr [[C36]], align 8404; CHECKII-NEXT:    [[C39:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 1405; CHECKII-NEXT:    store i64 [[TMP5]], ptr [[C39]], align 8406; CHECKII-NEXT:    [[ORG_C45:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 8407; CHECKII-NEXT:    store i64 [[TMP5]], ptr [[ORG_C45]], align 8408; CHECKII-NEXT:    [[FLOW51:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB25]], i32 7409; CHECKII-NEXT:    store i64 [[TMP2]], ptr [[FLOW51]], align 8410; CHECKII-NEXT:    [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX18]], align 8411; CHECKII-NEXT:    store i32 [[TMP6]], ptr [[ARRAYIDX26]], align 8412; CHECKII-NEXT:    store ptr [[T]], ptr [[T24]], align 8413; CHECKII-NEXT:    store ptr [[H]], ptr [[H30]], align 8414; CHECKII-NEXT:    store i64 [[C]], ptr [[C36]], align 8415; CHECKII-NEXT:    [[ORG_C69:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB]], i32 8416; CHECKII-NEXT:    store i64 [[C]], ptr [[ORG_C69]], align 8417; CHECKII-NEXT:    store i64 [[RC]], ptr [[FLOW19]], align 8418; CHECKII-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX18]], align 8419; CHECKII-NEXT:    [[MUL:%.*]] = shl nsw i64 [[CMP_0151]], 1420; CHECKII-NEXT:    [[CMP77_NOT_NOT:%.*]] = icmp slt i64 [[MUL]], [[MA]]421; CHECKII-NEXT:    br i1 [[CMP77_NOT_NOT]], label [[IF_THEN:%.*]], label [[IF_END87]]422; CHECKII:       if.then:423; CHECKII-NEXT:    [[SUB79:%.*]] = add nsw i64 [[MUL]], -1424; CHECKII-NEXT:    [[FLOW81:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[SUB79]], i32 7425; CHECKII-NEXT:    [[TMP7:%.*]] = load i64, ptr [[FLOW81]], align 8426; CHECKII-NEXT:    [[FLOW83:%.*]] = getelementptr inbounds [[STRUCT_ST]], ptr [[NEWST]], i64 [[MUL]], i32 7427; CHECKII-NEXT:    [[TMP8:%.*]] = load i64, ptr [[FLOW83]], align 8428; CHECKII-NEXT:    [[CMP84:%.*]] = icmp slt i64 [[TMP7]], [[TMP8]]429; CHECKII-NEXT:    [[ADD:%.*]] = zext i1 [[CMP84]] to i64430; CHECKII-NEXT:    [[SPEC_SELECT:%.*]] = or disjoint i64 [[MUL]], [[ADD]]431; CHECKII-NEXT:    br label [[IF_END87]]432; CHECKII:       if.end87:433; CHECKII-NEXT:    [[CMP_1]] = phi i64 [ [[MUL]], [[WHILE_BODY]] ], [ [[SPEC_SELECT]], [[IF_THEN]] ]434; CHECKII-NEXT:    [[CMP16_NOT:%.*]] = icmp sgt i64 [[CMP_1]], [[MA]]435; CHECKII-NEXT:    br i1 [[CMP16_NOT]], label [[WHILE_END]], label [[LAND_RHS]]436; CHECKII:       while.end:437; CHECKII-NEXT:    ret void438;439entry:440  %t1 = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 2441  store ptr %t, ptr %t1, align 8442  %h3 = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 3443  store ptr %h, ptr %h3, align 8444  %org_c = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 8445  store i64 %c, ptr %org_c, align 8446  %c6 = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 1447  store i64 %c, ptr %c6, align 8448  %flow = getelementptr inbounds %struct.st, ptr %newst, i64 0, i32 7449  store i64 %rc, ptr %flow, align 8450  %conv = trunc i64 %n to i32451  store i32 %conv, ptr %newst, align 8452  %flow10 = getelementptr inbounds %struct.st, ptr %newst, i64 1, i32 7453  %0 = load i64, ptr %flow10, align 8454  %flow12 = getelementptr inbounds %struct.st, ptr %newst, i64 2, i32 7455  %1 = load i64, ptr %flow12, align 8456  %cmp13 = icmp sgt i64 %0, %1457  %conv15 = select i1 %cmp13, i64 2, i64 3458  %cmp16.not149 = icmp sgt i64 %conv15, %ma459  br i1 %cmp16.not149, label %while.end, label %land.rhs460 461land.rhs:                                         ; preds = %entry, %if.end87462  %cmp.0151 = phi i64 [ %cmp.1, %if.end87 ], [ %conv15, %entry ]463  %pos.0150 = phi i64 [ %cmp.0151, %if.end87 ], [ 1, %entry ]464  %sub = add nsw i64 %cmp.0151, -1465  %flow19 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 7466  %2 = load i64, ptr %flow19, align 8467  %cmp20 = icmp sgt i64 %2, %rc468  br i1 %cmp20, label %while.body, label %while.end469 470while.body:                                       ; preds = %land.rhs471  %arrayidx18 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub472  %t24 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 2473  %3 = load ptr, ptr %t24, align 8474  %sub25 = add nsw i64 %pos.0150, -1475  %arrayidx26 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25476  %t27 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 2477  store ptr %3, ptr %t27, align 8478  %h30 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 3479  %4 = load ptr, ptr %h30, align 8480  %h33 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 3481  store ptr %4, ptr %h33, align 8482  %c36 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 1483  %5 = load i64, ptr %c36, align 8484  %c39 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 1485  store i64 %5, ptr %c39, align 8486  %org_c45 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 8487  store i64 %5, ptr %org_c45, align 8488  %flow51 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub25, i32 7489  store i64 %2, ptr %flow51, align 8490  %6 = load i32, ptr %arrayidx18, align 8491  store i32 %6, ptr %arrayidx26, align 8492  store ptr %t, ptr %t24, align 8493  store ptr %h, ptr %h30, align 8494  store i64 %c, ptr %c36, align 8495  %org_c69 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub, i32 8496  store i64 %c, ptr %org_c69, align 8497  store i64 %rc, ptr %flow19, align 8498  store i32 %conv, ptr %arrayidx18, align 8499  %mul = shl nsw i64 %cmp.0151, 1500  %cmp77.not.not = icmp slt i64 %mul, %ma501  br i1 %cmp77.not.not, label %if.then, label %if.end87502 503if.then:                                          ; preds = %while.body504  %sub79 = add nsw i64 %mul, -1505  %flow81 = getelementptr inbounds %struct.st, ptr %newst, i64 %sub79, i32 7506  %7 = load i64, ptr %flow81, align 8507  %flow83 = getelementptr inbounds %struct.st, ptr %newst, i64 %mul, i32 7508  %8 = load i64, ptr %flow83, align 8509  %cmp84 = icmp slt i64 %7, %8510  %add = zext i1 %cmp84 to i64511  %spec.select = or disjoint i64 %mul, %add512  br label %if.end87513 514if.end87:                                         ; preds = %if.then, %while.body515  %cmp.1 = phi i64 [ %mul, %while.body ], [ %spec.select, %if.then ]516  %cmp16.not = icmp sgt i64 %cmp.1, %ma517  br i1 %cmp16.not, label %while.end, label %land.rhs518 519while.end:                                        ; preds = %if.end87, %land.rhs, %entry520  ret void521}522 523 524; This `or` is not transformed as it is not the last instruction in the block525define i32 @or_notatendofblock(ptr nocapture noundef %x, i32 noundef %n, ptr nocapture noundef readonly %z) {526; CHECKOO-LABEL: @or_notatendofblock(527; CHECKOO-NEXT:  entry:528; CHECKOO-NEXT:    [[CMP19:%.*]] = icmp sgt i32 [[N:%.*]], 0529; CHECKOO-NEXT:    br i1 [[CMP19]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]530; CHECKOO:       for.body.preheader:531; CHECKOO-NEXT:    [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[N]] to i64532; CHECKOO-NEXT:    br label [[FOR_BODY:%.*]]533; CHECKOO:       for.cond.cleanup:534; CHECKOO-NEXT:    [[Y_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y_1:%.*]], [[IF_END:%.*]] ]535; CHECKOO-NEXT:    ret i32 [[Y_0_LCSSA]]536; CHECKOO:       for.body:537; CHECKOO-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END]] ]538; CHECKOO-NEXT:    [[Y_020:%.*]] = phi i32 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[Y_1]], [[IF_END]] ]539; CHECKOO-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[X:%.*]], i64 [[INDVARS_IV]]540; CHECKOO-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4541; CHECKOO-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[Y_020]]542; CHECKOO-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[ADD]], 0543; CHECKOO-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[IF_THEN:%.*]]544; CHECKOO:       if.then:545; CHECKOO-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[Z:%.*]], i64 [[INDVARS_IV]]546; CHECKOO-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4547; CHECKOO-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]548; CHECKOO-NEXT:    [[DIV1:%.*]] = sdiv i32 [[DIV]], [[TMP1]]549; CHECKOO-NEXT:    [[DIV2:%.*]] = sdiv i32 [[DIV1]], [[TMP1]]550; CHECKOO-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[DIV2]], 0551; CHECKOO-NEXT:    [[CONV:%.*]] = zext i1 [[CMP5]] to i32552; CHECKOO-NEXT:    [[OR1:%.*]] = or i32 [[CONV]], [[ADD]]553; CHECKOO-NEXT:    [[OR:%.*]] = add i32 [[OR1]], 1554; CHECKOO-NEXT:    br label [[IF_END]]555; CHECKOO:       if.end:556; CHECKOO-NEXT:    [[Y_1]] = phi i32 [ [[OR]], [[IF_THEN]] ], [ 0, [[FOR_BODY]] ]557; CHECKOO-NEXT:    store i32 [[Y_1]], ptr [[ARRAYIDX]], align 4558; CHECKOO-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1559; CHECKOO-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]560; CHECKOO-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP]], label [[FOR_BODY]]561;562; CHECKII-LABEL: @or_notatendofblock(563; CHECKII-NEXT:  entry:564; CHECKII-NEXT:    [[CMP19:%.*]] = icmp sgt i32 [[N:%.*]], 0565; CHECKII-NEXT:    br i1 [[CMP19]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]566; CHECKII:       for.body.preheader:567; CHECKII-NEXT:    [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[N]] to i64568; CHECKII-NEXT:    br label [[FOR_BODY:%.*]]569; CHECKII:       for.cond.cleanup:570; CHECKII-NEXT:    [[Y_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y_1:%.*]], [[IF_END:%.*]] ]571; CHECKII-NEXT:    ret i32 [[Y_0_LCSSA]]572; CHECKII:       for.body:573; CHECKII-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END]] ]574; CHECKII-NEXT:    [[Y_020:%.*]] = phi i32 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[Y_1]], [[IF_END]] ]575; CHECKII-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[X:%.*]], i64 [[INDVARS_IV]]576; CHECKII-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4577; CHECKII-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[Y_020]]578; CHECKII-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[ADD]], 0579; CHECKII-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[IF_THEN:%.*]]580; CHECKII:       if.then:581; CHECKII-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[Z:%.*]], i64 [[INDVARS_IV]]582; CHECKII-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4583; CHECKII-NEXT:    [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]]584; CHECKII-NEXT:    [[DIV1:%.*]] = sdiv i32 [[DIV]], [[TMP1]]585; CHECKII-NEXT:    [[DIV2:%.*]] = sdiv i32 [[DIV1]], [[TMP1]]586; CHECKII-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[DIV2]], 0587; CHECKII-NEXT:    [[CONV:%.*]] = zext i1 [[CMP5]] to i32588; CHECKII-NEXT:    [[OR1:%.*]] = or i32 [[CONV]], [[ADD]]589; CHECKII-NEXT:    [[OR:%.*]] = add i32 [[OR1]], 1590; CHECKII-NEXT:    br label [[IF_END]]591; CHECKII:       if.end:592; CHECKII-NEXT:    [[Y_1]] = phi i32 [ [[OR]], [[IF_THEN]] ], [ 0, [[FOR_BODY]] ]593; CHECKII-NEXT:    store i32 [[Y_1]], ptr [[ARRAYIDX]], align 4594; CHECKII-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1595; CHECKII-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]596; CHECKII-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP]], label [[FOR_BODY]]597;598entry:599  %cmp19 = icmp sgt i32 %n, 0600  br i1 %cmp19, label %for.body.preheader, label %for.cond.cleanup601 602for.body.preheader:603  %wide.trip.count = zext nneg i32 %n to i64604  br label %for.body605 606for.cond.cleanup:607  %y.0.lcssa = phi i32 [ 0, %entry ], [ %y.1, %if.end ]608  ret i32 %y.0.lcssa609 610for.body:611  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %if.end ]612  %y.020 = phi i32 [ 0, %for.body.preheader ], [ %y.1, %if.end ]613  %arrayidx = getelementptr inbounds i32, ptr %x, i64 %indvars.iv614  %0 = load i32, ptr %arrayidx, align 4615  %add = add nsw i32 %0, %y.020616  %tobool.not = icmp eq i32 %add, 0617  br i1 %tobool.not, label %if.end, label %if.then618 619if.then:620  %arrayidx4 = getelementptr inbounds i32, ptr %z, i64 %indvars.iv621  %1 = load i32, ptr %arrayidx4, align 4622  %div = sdiv i32 %0, %1623  %div1 = sdiv i32 %div, %1624  %div2 = sdiv i32 %div1, %1625  %cmp5 = icmp sgt i32 %div2, 0626  %conv = zext i1 %cmp5 to i32627  %or1 = or i32 %conv, %add628  %or = add i32 %or1, 1629  br label %if.end630 631if.end:632  %y.1 = phi i32 [ %or, %if.then ], [ 0, %for.body ]633  store i32 %y.1, ptr %arrayidx, align 4634  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1635  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count636  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body637}638 639 640; Similar to the last test, an artificial test with the or as the last instruction and a select in the same group.641define i32 @or_samegroup(ptr nocapture noundef %x, i32 noundef %n, ptr nocapture noundef readonly %z) {642; CHECKOO-LABEL: @or_samegroup(643; CHECKOO-NEXT:  entry:644; CHECKOO-NEXT:    [[CMP19:%.*]] = icmp sgt i32 [[N:%.*]], 0645; CHECKOO-NEXT:    br i1 [[CMP19]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]646; CHECKOO:       for.body.preheader:647; CHECKOO-NEXT:    [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[N]] to i64648; CHECKOO-NEXT:    br label [[FOR_BODY:%.*]]649; CHECKOO:       for.cond.cleanup:650; CHECKOO-NEXT:    [[Y_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y_1:%.*]], [[IF_END:%.*]] ]651; CHECKOO-NEXT:    ret i32 [[Y_0_LCSSA]]652; CHECKOO:       for.body:653; CHECKOO-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END]] ]654; CHECKOO-NEXT:    [[Y_020:%.*]] = phi i32 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[Y_1]], [[IF_END]] ]655; CHECKOO-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[X:%.*]], i64 [[INDVARS_IV]]656; CHECKOO-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4657; CHECKOO-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[Y_020]]658; CHECKOO-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[ADD]], 0659; CHECKOO-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[IF_THEN:%.*]]660; CHECKOO:       if.then:661; CHECKOO-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[Z:%.*]], i64 [[INDVARS_IV]]662; CHECKOO-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4663; CHECKOO-NEXT:    [[DIV:%.*]] = sdiv i32 [[Y_020]], [[TMP1]]664; CHECKOO-NEXT:    [[DIV1:%.*]] = sdiv i32 [[DIV]], [[TMP1]]665; CHECKOO-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[DIV1]], 0666; CHECKOO-NEXT:    [[CONV:%.*]] = zext i1 [[CMP5]] to i32667; CHECKOO-NEXT:    [[SEL_FROZEN:%.*]] = freeze i1 [[CMP5]]668; CHECKOO-NEXT:    br i1 [[SEL_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]669; CHECKOO:       select.true.sink:670; CHECKOO-NEXT:    [[TMP2:%.*]] = or i32 1, [[ADD]]671; CHECKOO-NEXT:    br label [[SELECT_FALSE]]672; CHECKOO:       select.end:673; CHECKOO-NEXT:    [[SEL:%.*]] = phi i32 [ [[ADD]], [[SELECT_END]] ], [ 1, [[IF_THEN]] ]674; CHECKOO-NEXT:    [[OR:%.*]] = phi i32 [ [[TMP2]], [[SELECT_END]] ], [ 1, [[IF_THEN]] ]675; CHECKOO-NEXT:    br label [[IF_END]]676; CHECKOO:       if.end:677; CHECKOO-NEXT:    [[Y_1]] = phi i32 [ [[SEL]], [[SELECT_FALSE]] ], [ 0, [[FOR_BODY]] ]678; CHECKOO-NEXT:    store i32 [[Y_1]], ptr [[ARRAYIDX]], align 4679; CHECKOO-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1680; CHECKOO-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]681; CHECKOO-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP]], label [[FOR_BODY]]682;683; CHECKII-LABEL: @or_samegroup(684; CHECKII-NEXT:  entry:685; CHECKII-NEXT:    [[CMP19:%.*]] = icmp sgt i32 [[N:%.*]], 0686; CHECKII-NEXT:    br i1 [[CMP19]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]687; CHECKII:       for.body.preheader:688; CHECKII-NEXT:    [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[N]] to i64689; CHECKII-NEXT:    br label [[FOR_BODY:%.*]]690; CHECKII:       for.cond.cleanup:691; CHECKII-NEXT:    [[Y_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y_1:%.*]], [[IF_END:%.*]] ]692; CHECKII-NEXT:    ret i32 [[Y_0_LCSSA]]693; CHECKII:       for.body:694; CHECKII-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END]] ]695; CHECKII-NEXT:    [[Y_020:%.*]] = phi i32 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[Y_1]], [[IF_END]] ]696; CHECKII-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[X:%.*]], i64 [[INDVARS_IV]]697; CHECKII-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4698; CHECKII-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[Y_020]]699; CHECKII-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[ADD]], 0700; CHECKII-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[IF_THEN:%.*]]701; CHECKII:       if.then:702; CHECKII-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[Z:%.*]], i64 [[INDVARS_IV]]703; CHECKII-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4704; CHECKII-NEXT:    [[DIV:%.*]] = sdiv i32 [[Y_020]], [[TMP1]]705; CHECKII-NEXT:    [[DIV1:%.*]] = sdiv i32 [[DIV]], [[TMP1]]706; CHECKII-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[DIV1]], 0707; CHECKII-NEXT:    [[CONV:%.*]] = zext i1 [[CMP5]] to i32708; CHECKII-NEXT:    [[SEL:%.*]] = select i1 [[CMP5]], i32 [[ADD]], i32 1709; CHECKII-NEXT:    [[OR:%.*]] = or i32 [[CONV]], [[SEL]]710; CHECKII-NEXT:    br label [[IF_END]]711; CHECKII:       if.end:712; CHECKII-NEXT:    [[Y_1]] = phi i32 [ [[SEL]], [[IF_THEN]] ], [ 0, [[FOR_BODY]] ]713; CHECKII-NEXT:    store i32 [[Y_1]], ptr [[ARRAYIDX]], align 4714; CHECKII-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1715; CHECKII-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]716; CHECKII-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP]], label [[FOR_BODY]]717;718entry:719  %cmp19 = icmp sgt i32 %n, 0720  br i1 %cmp19, label %for.body.preheader, label %for.cond.cleanup721 722for.body.preheader:723  %wide.trip.count = zext nneg i32 %n to i64724  br label %for.body725 726for.cond.cleanup:727  %y.0.lcssa = phi i32 [ 0, %entry ], [ %y.1, %if.end ]728  ret i32 %y.0.lcssa729 730for.body:731  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %if.end ]732  %y.020 = phi i32 [ 0, %for.body.preheader ], [ %y.1, %if.end ]733  %arrayidx = getelementptr inbounds i32, ptr %x, i64 %indvars.iv734  %0 = load i32, ptr %arrayidx, align 4735  %add = add nsw i32 %0, %y.020736  %tobool.not = icmp eq i32 %add, 0737  br i1 %tobool.not, label %if.end, label %if.then738 739if.then:740  %arrayidx4 = getelementptr inbounds i32, ptr %z, i64 %indvars.iv741  %1 = load i32, ptr %arrayidx4, align 4742  %div = sdiv i32 %y.020, %1743  %div1 = sdiv i32 %div, %1744  %cmp5 = icmp sgt i32 %div1, 0745  %conv = zext i1 %cmp5 to i32746  %sel = select i1 %cmp5, i32 %add, i32 1747  %or = or i32 %conv, %sel748  br label %if.end749 750if.end:751  %y.1 = phi i32 [ %sel, %if.then ], [ 0, %for.body ]752  store i32 %y.1, ptr %arrayidx, align 4753  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1754  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count755  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body756}757 758; Same test again with a one use value group of values on the or759define i32 @or_oneusevalues(ptr nocapture noundef %x, i32 noundef %n, ptr nocapture noundef readonly %z) {760; CHECKOO-LABEL: @or_oneusevalues(761; CHECKOO-NEXT:  entry:762; CHECKOO-NEXT:    [[CMP19:%.*]] = icmp sgt i32 [[N:%.*]], 0763; CHECKOO-NEXT:    br i1 [[CMP19]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]764; CHECKOO:       for.body.preheader:765; CHECKOO-NEXT:    [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[N]] to i64766; CHECKOO-NEXT:    br label [[FOR_BODY:%.*]]767; CHECKOO:       for.cond.cleanup:768; CHECKOO-NEXT:    [[Y_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y_1:%.*]], [[IF_END:%.*]] ]769; CHECKOO-NEXT:    ret i32 [[Y_0_LCSSA]]770; CHECKOO:       for.body:771; CHECKOO-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END]] ]772; CHECKOO-NEXT:    [[Y_020:%.*]] = phi i32 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[Y_1]], [[IF_END]] ]773; CHECKOO-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[X:%.*]], i64 [[INDVARS_IV]]774; CHECKOO-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4775; CHECKOO-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[Y_020]]776; CHECKOO-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[ADD]], 0777; CHECKOO-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[IF_THEN:%.*]]778; CHECKOO:       if.then:779; CHECKOO-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[Z:%.*]], i64 [[INDVARS_IV]]780; CHECKOO-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4781; CHECKOO-NEXT:    [[DIV:%.*]] = sdiv i32 [[Y_020]], [[TMP1]]782; CHECKOO-NEXT:    [[DIV1:%.*]] = sdiv i32 [[DIV]], [[TMP1]]783; CHECKOO-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[DIV1]], 0784; CHECKOO-NEXT:    [[CONV:%.*]] = zext i1 [[CMP5]] to i32785; CHECKOO-NEXT:    [[ADD1:%.*]] = add i32 [[ADD]], 1786; CHECKOO-NEXT:    [[ADD2:%.*]] = or i32 [[ADD1]], 1787; CHECKOO-NEXT:    [[CMP5_FROZEN:%.*]] = freeze i1 [[CMP5]]788; CHECKOO-NEXT:    br i1 [[CMP5_FROZEN]], label [[SELECT_END:%.*]], label [[SELECT_FALSE:%.*]]789; CHECKOO:       select.true.sink:790; CHECKOO-NEXT:    [[TMP2:%.*]] = or i32 1, [[ADD2]]791; CHECKOO-NEXT:    br label [[SELECT_FALSE]]792; CHECKOO:       select.end:793; CHECKOO-NEXT:    [[OR:%.*]] = phi i32 [ [[TMP2]], [[SELECT_END]] ], [ [[ADD2]], [[IF_THEN]] ]794; CHECKOO-NEXT:    br label [[IF_END]]795; CHECKOO:       if.end:796; CHECKOO-NEXT:    [[Y_1]] = phi i32 [ [[OR]], [[SELECT_FALSE]] ], [ 0, [[FOR_BODY]] ]797; CHECKOO-NEXT:    store i32 [[Y_1]], ptr [[ARRAYIDX]], align 4798; CHECKOO-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1799; CHECKOO-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]800; CHECKOO-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP]], label [[FOR_BODY]]801;802; CHECKII-LABEL: @or_oneusevalues(803; CHECKII-NEXT:  entry:804; CHECKII-NEXT:    [[CMP19:%.*]] = icmp sgt i32 [[N:%.*]], 0805; CHECKII-NEXT:    br i1 [[CMP19]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]806; CHECKII:       for.body.preheader:807; CHECKII-NEXT:    [[WIDE_TRIP_COUNT:%.*]] = zext nneg i32 [[N]] to i64808; CHECKII-NEXT:    br label [[FOR_BODY:%.*]]809; CHECKII:       for.cond.cleanup:810; CHECKII-NEXT:    [[Y_0_LCSSA:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[Y_1:%.*]], [[IF_END:%.*]] ]811; CHECKII-NEXT:    ret i32 [[Y_0_LCSSA]]812; CHECKII:       for.body:813; CHECKII-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], [[IF_END]] ]814; CHECKII-NEXT:    [[Y_020:%.*]] = phi i32 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[Y_1]], [[IF_END]] ]815; CHECKII-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[X:%.*]], i64 [[INDVARS_IV]]816; CHECKII-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4817; CHECKII-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[Y_020]]818; CHECKII-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[ADD]], 0819; CHECKII-NEXT:    br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[IF_THEN:%.*]]820; CHECKII:       if.then:821; CHECKII-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[Z:%.*]], i64 [[INDVARS_IV]]822; CHECKII-NEXT:    [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX4]], align 4823; CHECKII-NEXT:    [[DIV:%.*]] = sdiv i32 [[Y_020]], [[TMP1]]824; CHECKII-NEXT:    [[DIV1:%.*]] = sdiv i32 [[DIV]], [[TMP1]]825; CHECKII-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[DIV1]], 0826; CHECKII-NEXT:    [[CONV:%.*]] = zext i1 [[CMP5]] to i32827; CHECKII-NEXT:    [[ADD1:%.*]] = add i32 [[ADD]], 1828; CHECKII-NEXT:    [[ADD2:%.*]] = or i32 [[ADD1]], 1829; CHECKII-NEXT:    [[OR:%.*]] = or i32 [[CONV]], [[ADD2]]830; CHECKII-NEXT:    br label [[IF_END]]831; CHECKII:       if.end:832; CHECKII-NEXT:    [[Y_1]] = phi i32 [ [[OR]], [[IF_THEN]] ], [ 0, [[FOR_BODY]] ]833; CHECKII-NEXT:    store i32 [[Y_1]], ptr [[ARRAYIDX]], align 4834; CHECKII-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1835; CHECKII-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]836; CHECKII-NEXT:    br i1 [[EXITCOND_NOT]], label [[FOR_COND_CLEANUP]], label [[FOR_BODY]]837;838entry:839  %cmp19 = icmp sgt i32 %n, 0840  br i1 %cmp19, label %for.body.preheader, label %for.cond.cleanup841 842for.body.preheader:843  %wide.trip.count = zext nneg i32 %n to i64844  br label %for.body845 846for.cond.cleanup:847  %y.0.lcssa = phi i32 [ 0, %entry ], [ %y.1, %if.end ]848  ret i32 %y.0.lcssa849 850for.body:851  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %if.end ]852  %y.020 = phi i32 [ 0, %for.body.preheader ], [ %y.1, %if.end ]853  %arrayidx = getelementptr inbounds i32, ptr %x, i64 %indvars.iv854  %0 = load i32, ptr %arrayidx, align 4855  %add = add nsw i32 %0, %y.020856  %tobool.not = icmp eq i32 %add, 0857  br i1 %tobool.not, label %if.end, label %if.then858 859if.then:860  %arrayidx4 = getelementptr inbounds i32, ptr %z, i64 %indvars.iv861  %1 = load i32, ptr %arrayidx4, align 4862  %div = sdiv i32 %y.020, %1863  %div1 = sdiv i32 %div, %1864  %cmp5 = icmp sgt i32 %div1, 0865  %conv = zext i1 %cmp5 to i32866  %add1 = add i32 %add, 1867  %add2 = or i32 %add1, 1868  %or = or i32 %conv, %add2869  br label %if.end870 871if.end:872  %y.1 = phi i32 [ %or, %if.then ], [ 0, %for.body ]873  store i32 %y.1, ptr %arrayidx, align 4874  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1875  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count876  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body877}878 879declare i64 @payload(i64, ptr, ptr, i64)880 881define void @outer_latch_heuristic(ptr %dst, ptr %src, i64 %p, i64 %dim) {882; CHECKOO-LABEL: @outer_latch_heuristic(883; CHECKOO-NEXT:  entry:884; CHECKOO-NEXT:    br label [[OUTER_LOOP:%.*]]885; CHECKOO:       outer.loop:886; CHECKOO-NEXT:    [[K_020_US:%.*]] = phi i64 [ [[INC7_US:%.*]], [[SELECT_END:%.*]] ], [ 0, [[ENTRY:%.*]] ]887; CHECKOO-NEXT:    [[J:%.*]] = phi i64 [ [[J_NEXT:%.*]], [[SELECT_END]] ], [ 0, [[ENTRY]] ]888; CHECKOO-NEXT:    [[I:%.*]] = phi i64 [ [[I_NEXT:%.*]], [[SELECT_END]] ], [ 0, [[ENTRY]] ]889; CHECKOO-NEXT:    [[ARRAYIDX_US:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]890; CHECKOO-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARRAYIDX_US]], align 8891; CHECKOO-NEXT:    [[ARRAYIDX1_US:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]892; CHECKOO-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[ARRAYIDX1_US]], align 8893; CHECKOO-NEXT:    br label [[INNER_LOOP:%.*]]894; CHECKOO:       inner.loop:895; CHECKOO-NEXT:    [[LSR_IV:%.*]] = phi i64 [ [[DIM:%.*]], [[OUTER_LOOP]] ], [ [[LSR_IV_NEXT:%.*]], [[INNER_LOOP]] ]896; CHECKOO-NEXT:    [[DIFF_04_I_US:%.*]] = phi i64 [ [[CALL_I_US:%.*]], [[INNER_LOOP]] ], [ 0, [[OUTER_LOOP]] ]897; CHECKOO-NEXT:    [[CALL_I_US]] = tail call i64 @payload(i64 [[DIFF_04_I_US]], ptr [[TMP0]], ptr [[TMP1]], i64 [[P:%.*]])898; CHECKOO-NEXT:    [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], -1899; CHECKOO-NEXT:    [[EXITCOND_NOT_I_US:%.*]] = icmp eq i64 [[LSR_IV_NEXT]], 0900; CHECKOO-NEXT:    br i1 [[EXITCOND_NOT_I_US]], label [[LATCH:%.*]], label [[INNER_LOOP]]901; CHECKOO:       latch:902; CHECKOO-NEXT:    [[CMP2_US:%.*]] = icmp sgt i64 [[CALL_I_US]], -1903; CHECKOO-NEXT:    [[DIFF_0_LCSSA_I_LOBIT_US:%.*]] = lshr i64 [[CALL_I_US]], 63904; CHECKOO-NEXT:    [[CMP2_US_FROZEN:%.*]] = freeze i1 [[CMP2_US]]905; CHECKOO-NEXT:    br i1 [[CMP2_US_FROZEN]], label [[SELECT_TRUE_SINK:%.*]], label [[SELECT_FALSE_SINK:%.*]]906; CHECKOO:       select.true.sink:907; CHECKOO-NEXT:    [[TMP2:%.*]] = add nsw i64 [[J]], 1908; CHECKOO-NEXT:    br label [[SELECT_END]]909; CHECKOO:       select.false.sink:910; CHECKOO-NEXT:    [[TMP3:%.*]] = add nsw i64 1, [[I]]911; CHECKOO-NEXT:    br label [[SELECT_END]]912; CHECKOO:       select.end:913; CHECKOO-NEXT:    [[I_NEXT]] = phi i64 [ [[I]], [[SELECT_TRUE_SINK]] ], [ [[TMP3]], [[SELECT_FALSE_SINK]] ]914; CHECKOO-NEXT:    [[J_NEXT]] = phi i64 [ [[TMP2]], [[SELECT_TRUE_SINK]] ], [ [[J]], [[SELECT_FALSE_SINK]] ]915; CHECKOO-NEXT:    [[COND_IN_US:%.*]] = phi ptr [ [[ARRAYIDX1_US]], [[SELECT_TRUE_SINK]] ], [ [[ARRAYIDX_US]], [[SELECT_FALSE_SINK]] ]916; CHECKOO-NEXT:    [[INC4_US:%.*]] = zext i1 [[CMP2_US]] to i64917; CHECKOO-NEXT:    [[COND_US:%.*]] = load ptr, ptr [[COND_IN_US]], align 8918; CHECKOO-NEXT:    [[ARRAYIDX6_US:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[K_020_US]]919; CHECKOO-NEXT:    store ptr [[COND_US]], ptr [[ARRAYIDX6_US]], align 8920; CHECKOO-NEXT:    [[INC7_US]] = add i64 [[K_020_US]], 1921; CHECKOO-NEXT:    [[EXITCOND23_NOT:%.*]] = icmp eq i64 [[K_020_US]], 1000922; CHECKOO-NEXT:    br i1 [[EXITCOND23_NOT]], label [[EXIT:%.*]], label [[OUTER_LOOP]]923; CHECKOO:       exit:924; CHECKOO-NEXT:    ret void925;926; CHECKII-LABEL: @outer_latch_heuristic(927; CHECKII-NEXT:  entry:928; CHECKII-NEXT:    br label [[OUTER_LOOP:%.*]]929; CHECKII:       outer.loop:930; CHECKII-NEXT:    [[K_020_US:%.*]] = phi i64 [ [[INC7_US:%.*]], [[LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]931; CHECKII-NEXT:    [[J:%.*]] = phi i64 [ [[J_NEXT:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]932; CHECKII-NEXT:    [[I:%.*]] = phi i64 [ [[I_NEXT:%.*]], [[LATCH]] ], [ 0, [[ENTRY]] ]933; CHECKII-NEXT:    [[ARRAYIDX_US:%.*]] = getelementptr inbounds ptr, ptr [[SRC:%.*]], i64 [[I]]934; CHECKII-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARRAYIDX_US]], align 8935; CHECKII-NEXT:    [[ARRAYIDX1_US:%.*]] = getelementptr inbounds ptr, ptr [[SRC]], i64 [[J]]936; CHECKII-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[ARRAYIDX1_US]], align 8937; CHECKII-NEXT:    br label [[INNER_LOOP:%.*]]938; CHECKII:       inner.loop:939; CHECKII-NEXT:    [[LSR_IV:%.*]] = phi i64 [ [[DIM:%.*]], [[OUTER_LOOP]] ], [ [[LSR_IV_NEXT:%.*]], [[INNER_LOOP]] ]940; CHECKII-NEXT:    [[DIFF_04_I_US:%.*]] = phi i64 [ [[CALL_I_US:%.*]], [[INNER_LOOP]] ], [ 0, [[OUTER_LOOP]] ]941; CHECKII-NEXT:    [[CALL_I_US]] = tail call i64 @payload(i64 [[DIFF_04_I_US]], ptr [[TMP0]], ptr [[TMP1]], i64 [[P:%.*]])942; CHECKII-NEXT:    [[LSR_IV_NEXT]] = add i64 [[LSR_IV]], -1943; CHECKII-NEXT:    [[EXITCOND_NOT_I_US:%.*]] = icmp eq i64 [[LSR_IV_NEXT]], 0944; CHECKII-NEXT:    br i1 [[EXITCOND_NOT_I_US]], label [[LATCH]], label [[INNER_LOOP]]945; CHECKII:       latch:946; CHECKII-NEXT:    [[CMP2_US:%.*]] = icmp sgt i64 [[CALL_I_US]], -1947; CHECKII-NEXT:    [[DIFF_0_LCSSA_I_LOBIT_US:%.*]] = lshr i64 [[CALL_I_US]], 63948; CHECKII-NEXT:    [[I_NEXT]] = add nsw i64 [[DIFF_0_LCSSA_I_LOBIT_US]], [[I]]949; CHECKII-NEXT:    [[INC4_US:%.*]] = zext i1 [[CMP2_US]] to i64950; CHECKII-NEXT:    [[J_NEXT]] = add nsw i64 [[J]], [[INC4_US]]951; CHECKII-NEXT:    [[COND_IN_US:%.*]] = select i1 [[CMP2_US]], ptr [[ARRAYIDX1_US]], ptr [[ARRAYIDX_US]]952; CHECKII-NEXT:    [[COND_US:%.*]] = load ptr, ptr [[COND_IN_US]], align 8953; CHECKII-NEXT:    [[ARRAYIDX6_US:%.*]] = getelementptr inbounds ptr, ptr [[DST:%.*]], i64 [[K_020_US]]954; CHECKII-NEXT:    store ptr [[COND_US]], ptr [[ARRAYIDX6_US]], align 8955; CHECKII-NEXT:    [[INC7_US]] = add i64 [[K_020_US]], 1956; CHECKII-NEXT:    [[EXITCOND23_NOT:%.*]] = icmp eq i64 [[K_020_US]], 1000957; CHECKII-NEXT:    br i1 [[EXITCOND23_NOT]], label [[EXIT:%.*]], label [[OUTER_LOOP]]958; CHECKII:       exit:959; CHECKII-NEXT:    ret void960;961entry:962  br label %outer.loop963 964outer.loop:965  %k.020.us = phi i64 [ %inc7.us, %latch ], [ 0, %entry ]966  %j = phi i64 [ %j.next, %latch ], [ 0, %entry ]967  %i = phi i64 [ %i.next, %latch ], [ 0, %entry ]968  %arrayidx.us = getelementptr inbounds ptr, ptr %src, i64 %i969  %4 = load ptr, ptr %arrayidx.us, align 8970  %arrayidx1.us = getelementptr inbounds ptr, ptr %src, i64 %j971  %5 = load ptr, ptr %arrayidx1.us, align 8972  br label %inner.loop973 974inner.loop:975  %lsr.iv = phi i64 [ %dim, %outer.loop ], [ %lsr.iv.next, %inner.loop ]976  %diff.04.i.us = phi i64 [ %call.i.us, %inner.loop ], [ 0, %outer.loop ]977  %call.i.us = tail call i64 @payload(i64 %diff.04.i.us, ptr %4, ptr %5, i64 %p)978  %lsr.iv.next = add i64 %lsr.iv, -1979  %exitcond.not.i.us = icmp eq i64 %lsr.iv.next, 0980  br i1 %exitcond.not.i.us, label %latch, label %inner.loop981 982latch:983  %cmp2.us = icmp sgt i64 %call.i.us, -1984  %diff.0.lcssa.i.lobit.us = lshr i64 %call.i.us, 63985  %i.next = add nsw i64 %diff.0.lcssa.i.lobit.us, %i986  %inc4.us = zext i1 %cmp2.us to i64987  %j.next = add nsw i64 %j, %inc4.us988  %cond.in.us = select i1 %cmp2.us, ptr %arrayidx1.us, ptr %arrayidx.us989  %cond.us = load ptr, ptr %cond.in.us, align 8990  %arrayidx6.us = getelementptr inbounds ptr, ptr %dst, i64 %k.020.us991  store ptr %cond.us, ptr %arrayidx6.us, align 8992  %inc7.us = add i64 %k.020.us, 1993  %exitcond23.not = icmp eq i64 %k.020.us, 1000994  br i1 %exitcond23.not, label %exit, label %outer.loop995 996exit:997  ret void998}999