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