brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.0 KiB · d107e5d Raw
332 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; Test 32-bit atomic minimum and maximum.  Here we match the z10 versions,3; which can't use LOCR.4;5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s6 7; Todo: If-converter no longer producing CondReturns (with AtomicExpand pass).8 9; Check signed minimum.10define i32 @f1(i32 %dummy, ptr %src, i32 %b) {11; CHECK-LABEL: f1:12; CHECK:       # %bb.0:13; CHECK-NEXT:    l %r2, 0(%r3)14; CHECK-NEXT:    j .LBB0_215; CHECK-NEXT:  .LBB0_1: # %atomicrmw.start16; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=117; CHECK-NEXT:    cs %r2, %r0, 0(%r3)18; CHECK-NEXT:    je .LBB0_419; CHECK-NEXT:  .LBB0_2: # %atomicrmw.start20; CHECK-NEXT:    # =>This Inner Loop Header: Depth=121; CHECK-NEXT:    lr %r0, %r222; CHECK-NEXT:    crjle %r2, %r4, .LBB0_123; CHECK-NEXT:  # %bb.3: # %atomicrmw.start24; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=125; CHECK-NEXT:    lr %r0, %r426; CHECK-NEXT:    j .LBB0_127; CHECK-NEXT:  .LBB0_4: # %atomicrmw.end28; CHECK-NEXT:    br %r1429  %res = atomicrmw min ptr %src, i32 %b seq_cst30  ret i32 %res31}32 33; Check signed maximum.34define i32 @f2(i32 %dummy, ptr %src, i32 %b) {35; CHECK-LABEL: f2:36; CHECK:       # %bb.0:37; CHECK-NEXT:    l %r2, 0(%r3)38; CHECK-NEXT:    j .LBB1_239; CHECK-NEXT:  .LBB1_1: # %atomicrmw.start40; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=141; CHECK-NEXT:    cs %r2, %r0, 0(%r3)42; CHECK-NEXT:    je .LBB1_443; CHECK-NEXT:  .LBB1_2: # %atomicrmw.start44; CHECK-NEXT:    # =>This Inner Loop Header: Depth=145; CHECK-NEXT:    lr %r0, %r246; CHECK-NEXT:    crjh %r2, %r4, .LBB1_147; CHECK-NEXT:  # %bb.3: # %atomicrmw.start48; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=149; CHECK-NEXT:    lr %r0, %r450; CHECK-NEXT:    j .LBB1_151; CHECK-NEXT:  .LBB1_4: # %atomicrmw.end52; CHECK-NEXT:    br %r1453  %res = atomicrmw max ptr %src, i32 %b seq_cst54  ret i32 %res55}56 57; Check unsigned minimum.58define i32 @f3(i32 %dummy, ptr %src, i32 %b) {59; CHECK-LABEL: f3:60; CHECK:       # %bb.0:61; CHECK-NEXT:    l %r2, 0(%r3)62; CHECK-NEXT:    j .LBB2_263; CHECK-NEXT:  .LBB2_1: # %atomicrmw.start64; CHECK-NEXT:    # in Loop: Header=BB2_2 Depth=165; CHECK-NEXT:    cs %r2, %r0, 0(%r3)66; CHECK-NEXT:    je .LBB2_467; CHECK-NEXT:  .LBB2_2: # %atomicrmw.start68; CHECK-NEXT:    # =>This Inner Loop Header: Depth=169; CHECK-NEXT:    lr %r0, %r270; CHECK-NEXT:    clrjle %r2, %r4, .LBB2_171; CHECK-NEXT:  # %bb.3: # %atomicrmw.start72; CHECK-NEXT:    # in Loop: Header=BB2_2 Depth=173; CHECK-NEXT:    lr %r0, %r474; CHECK-NEXT:    j .LBB2_175; CHECK-NEXT:  .LBB2_4: # %atomicrmw.end76; CHECK-NEXT:    br %r1477  %res = atomicrmw umin ptr %src, i32 %b seq_cst78  ret i32 %res79}80 81; Check unsigned maximum.82define i32 @f4(i32 %dummy, ptr %src, i32 %b) {83; CHECK-LABEL: f4:84; CHECK:       # %bb.0:85; CHECK-NEXT:    l %r2, 0(%r3)86; CHECK-NEXT:    j .LBB3_287; CHECK-NEXT:  .LBB3_1: # %atomicrmw.start88; CHECK-NEXT:    # in Loop: Header=BB3_2 Depth=189; CHECK-NEXT:    cs %r2, %r0, 0(%r3)90; CHECK-NEXT:    je .LBB3_491; CHECK-NEXT:  .LBB3_2: # %atomicrmw.start92; CHECK-NEXT:    # =>This Inner Loop Header: Depth=193; CHECK-NEXT:    lr %r0, %r294; CHECK-NEXT:    clrjh %r2, %r4, .LBB3_195; CHECK-NEXT:  # %bb.3: # %atomicrmw.start96; CHECK-NEXT:    # in Loop: Header=BB3_2 Depth=197; CHECK-NEXT:    lr %r0, %r498; CHECK-NEXT:    j .LBB3_199; CHECK-NEXT:  .LBB3_4: # %atomicrmw.end100; CHECK-NEXT:    br %r14101  %res = atomicrmw umax ptr %src, i32 %b seq_cst102  ret i32 %res103}104 105; Check the high end of the aligned CS range.106define i32 @f5(i32 %dummy, ptr %src, i32 %b) {107; CHECK-LABEL: f5:108; CHECK:       # %bb.0:109; CHECK-NEXT:    l %r2, 4092(%r3)110; CHECK-NEXT:    j .LBB4_2111; CHECK-NEXT:  .LBB4_1: # %atomicrmw.start112; CHECK-NEXT:    # in Loop: Header=BB4_2 Depth=1113; CHECK-NEXT:    cs %r2, %r0, 4092(%r3)114; CHECK-NEXT:    je .LBB4_4115; CHECK-NEXT:  .LBB4_2: # %atomicrmw.start116; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1117; CHECK-NEXT:    lr %r0, %r2118; CHECK-NEXT:    crjle %r2, %r4, .LBB4_1119; CHECK-NEXT:  # %bb.3: # %atomicrmw.start120; CHECK-NEXT:    # in Loop: Header=BB4_2 Depth=1121; CHECK-NEXT:    lr %r0, %r4122; CHECK-NEXT:    j .LBB4_1123; CHECK-NEXT:  .LBB4_4: # %atomicrmw.end124; CHECK-NEXT:    br %r14125  %ptr = getelementptr i32, ptr %src, i64 1023126  %res = atomicrmw min ptr %ptr, i32 %b seq_cst127  ret i32 %res128}129 130; Check the next word up, which requires CSY.131define i32 @f6(i32 %dummy, ptr %src, i32 %b) {132; CHECK-LABEL: f6:133; CHECK:       # %bb.0:134; CHECK-NEXT:    ly %r2, 4096(%r3)135; CHECK-NEXT:    j .LBB5_2136; CHECK-NEXT:  .LBB5_1: # %atomicrmw.start137; CHECK-NEXT:    # in Loop: Header=BB5_2 Depth=1138; CHECK-NEXT:    csy %r2, %r0, 4096(%r3)139; CHECK-NEXT:    je .LBB5_4140; CHECK-NEXT:  .LBB5_2: # %atomicrmw.start141; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1142; CHECK-NEXT:    lr %r0, %r2143; CHECK-NEXT:    crjle %r2, %r4, .LBB5_1144; CHECK-NEXT:  # %bb.3: # %atomicrmw.start145; CHECK-NEXT:    # in Loop: Header=BB5_2 Depth=1146; CHECK-NEXT:    lr %r0, %r4147; CHECK-NEXT:    j .LBB5_1148; CHECK-NEXT:  .LBB5_4: # %atomicrmw.end149; CHECK-NEXT:    br %r14150  %ptr = getelementptr i32, ptr %src, i64 1024151  %res = atomicrmw min ptr %ptr, i32 %b seq_cst152  ret i32 %res153}154 155; Check the high end of the aligned CSY range.156define i32 @f7(i32 %dummy, ptr %src, i32 %b) {157; CHECK-LABEL: f7:158; CHECK:       # %bb.0:159; CHECK-NEXT:    ly %r2, 524284(%r3)160; CHECK-NEXT:    j .LBB6_2161; CHECK-NEXT:  .LBB6_1: # %atomicrmw.start162; CHECK-NEXT:    # in Loop: Header=BB6_2 Depth=1163; CHECK-NEXT:    csy %r2, %r0, 524284(%r3)164; CHECK-NEXT:    je .LBB6_4165; CHECK-NEXT:  .LBB6_2: # %atomicrmw.start166; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1167; CHECK-NEXT:    lr %r0, %r2168; CHECK-NEXT:    crjle %r2, %r4, .LBB6_1169; CHECK-NEXT:  # %bb.3: # %atomicrmw.start170; CHECK-NEXT:    # in Loop: Header=BB6_2 Depth=1171; CHECK-NEXT:    lr %r0, %r4172; CHECK-NEXT:    j .LBB6_1173; CHECK-NEXT:  .LBB6_4: # %atomicrmw.end174; CHECK-NEXT:    br %r14175  %ptr = getelementptr i32, ptr %src, i64 131071176  %res = atomicrmw min ptr %ptr, i32 %b seq_cst177  ret i32 %res178}179 180; Check the next word up, which needs separate address logic.181define i32 @f8(i32 %dummy, ptr %src, i32 %b) {182; CHECK-LABEL: f8:183; CHECK:       # %bb.0:184; CHECK-NEXT:    agfi %r3, 524288185; CHECK-NEXT:    l %r2, 0(%r3)186; CHECK-NEXT:    j .LBB7_2187; CHECK-NEXT:  .LBB7_1: # %atomicrmw.start188; CHECK-NEXT:    # in Loop: Header=BB7_2 Depth=1189; CHECK-NEXT:    cs %r2, %r0, 0(%r3)190; CHECK-NEXT:    je .LBB7_4191; CHECK-NEXT:  .LBB7_2: # %atomicrmw.start192; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1193; CHECK-NEXT:    lr %r0, %r2194; CHECK-NEXT:    crjle %r2, %r4, .LBB7_1195; CHECK-NEXT:  # %bb.3: # %atomicrmw.start196; CHECK-NEXT:    # in Loop: Header=BB7_2 Depth=1197; CHECK-NEXT:    lr %r0, %r4198; CHECK-NEXT:    j .LBB7_1199; CHECK-NEXT:  .LBB7_4: # %atomicrmw.end200; CHECK-NEXT:    br %r14201  %ptr = getelementptr i32, ptr %src, i64 131072202  %res = atomicrmw min ptr %ptr, i32 %b seq_cst203  ret i32 %res204}205 206; Check the high end of the negative aligned CSY range.207define i32 @f9(i32 %dummy, ptr %src, i32 %b) {208; CHECK-LABEL: f9:209; CHECK:       # %bb.0:210; CHECK-NEXT:    ly %r2, -4(%r3)211; CHECK-NEXT:    j .LBB8_2212; CHECK-NEXT:  .LBB8_1: # %atomicrmw.start213; CHECK-NEXT:    # in Loop: Header=BB8_2 Depth=1214; CHECK-NEXT:    csy %r2, %r0, -4(%r3)215; CHECK-NEXT:    je .LBB8_4216; CHECK-NEXT:  .LBB8_2: # %atomicrmw.start217; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1218; CHECK-NEXT:    lr %r0, %r2219; CHECK-NEXT:    crjle %r2, %r4, .LBB8_1220; CHECK-NEXT:  # %bb.3: # %atomicrmw.start221; CHECK-NEXT:    # in Loop: Header=BB8_2 Depth=1222; CHECK-NEXT:    lr %r0, %r4223; CHECK-NEXT:    j .LBB8_1224; CHECK-NEXT:  .LBB8_4: # %atomicrmw.end225; CHECK-NEXT:    br %r14226  %ptr = getelementptr i32, ptr %src, i64 -1227  %res = atomicrmw min ptr %ptr, i32 %b seq_cst228  ret i32 %res229}230 231; Check the low end of the CSY range.232define i32 @f10(i32 %dummy, ptr %src, i32 %b) {233; CHECK-LABEL: f10:234; CHECK:       # %bb.0:235; CHECK-NEXT:    ly %r2, -524288(%r3)236; CHECK-NEXT:    j .LBB9_2237; CHECK-NEXT:  .LBB9_1: # %atomicrmw.start238; CHECK-NEXT:    # in Loop: Header=BB9_2 Depth=1239; CHECK-NEXT:    csy %r2, %r0, -524288(%r3)240; CHECK-NEXT:    je .LBB9_4241; CHECK-NEXT:  .LBB9_2: # %atomicrmw.start242; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1243; CHECK-NEXT:    lr %r0, %r2244; CHECK-NEXT:    crjle %r2, %r4, .LBB9_1245; CHECK-NEXT:  # %bb.3: # %atomicrmw.start246; CHECK-NEXT:    # in Loop: Header=BB9_2 Depth=1247; CHECK-NEXT:    lr %r0, %r4248; CHECK-NEXT:    j .LBB9_1249; CHECK-NEXT:  .LBB9_4: # %atomicrmw.end250; CHECK-NEXT:    br %r14251  %ptr = getelementptr i32, ptr %src, i64 -131072252  %res = atomicrmw min ptr %ptr, i32 %b seq_cst253  ret i32 %res254}255 256; Check the next word down, which needs separate address logic.257define i32 @f11(i32 %dummy, ptr %src, i32 %b) {258; CHECK-LABEL: f11:259; CHECK:       # %bb.0:260; CHECK-NEXT:    agfi %r3, -524292261; CHECK-NEXT:    l %r2, 0(%r3)262; CHECK-NEXT:    j .LBB10_2263; CHECK-NEXT:  .LBB10_1: # %atomicrmw.start264; CHECK-NEXT:    # in Loop: Header=BB10_2 Depth=1265; CHECK-NEXT:    cs %r2, %r0, 0(%r3)266; CHECK-NEXT:    je .LBB10_4267; CHECK-NEXT:  .LBB10_2: # %atomicrmw.start268; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1269; CHECK-NEXT:    lr %r0, %r2270; CHECK-NEXT:    crjle %r2, %r4, .LBB10_1271; CHECK-NEXT:  # %bb.3: # %atomicrmw.start272; CHECK-NEXT:    # in Loop: Header=BB10_2 Depth=1273; CHECK-NEXT:    lr %r0, %r4274; CHECK-NEXT:    j .LBB10_1275; CHECK-NEXT:  .LBB10_4: # %atomicrmw.end276; CHECK-NEXT:    br %r14277  %ptr = getelementptr i32, ptr %src, i64 -131073278  %res = atomicrmw min ptr %ptr, i32 %b seq_cst279  ret i32 %res280}281 282; Check that indexed addresses are not allowed.283define i32 @f12(i32 %dummy, i64 %base, i64 %index, i32 %b) {284; CHECK-LABEL: f12:285; CHECK:       # %bb.0:286; CHECK-NEXT:    l %r2, 0(%r4,%r3)287; CHECK-NEXT:    agr %r3, %r4288; CHECK-NEXT:    j .LBB11_2289; CHECK-NEXT:  .LBB11_1: # %atomicrmw.start290; CHECK-NEXT:    # in Loop: Header=BB11_2 Depth=1291; CHECK-NEXT:    cs %r2, %r0, 0(%r3)292; CHECK-NEXT:    je .LBB11_4293; CHECK-NEXT:  .LBB11_2: # %atomicrmw.start294; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1295; CHECK-NEXT:    lr %r0, %r2296; CHECK-NEXT:    crjle %r2, %r5, .LBB11_1297; CHECK-NEXT:  # %bb.3: # %atomicrmw.start298; CHECK-NEXT:    # in Loop: Header=BB11_2 Depth=1299; CHECK-NEXT:    lr %r0, %r5300; CHECK-NEXT:    j .LBB11_1301; CHECK-NEXT:  .LBB11_4: # %atomicrmw.end302; CHECK-NEXT:    br %r14303  %add = add i64 %base, %index304  %ptr = inttoptr i64 %add to ptr305  %res = atomicrmw min ptr %ptr, i32 %b seq_cst306  ret i32 %res307}308 309; Check that constants are handled.310define i32 @f13(i32 %dummy, ptr %ptr) {311; CHECK-LABEL: f13:312; CHECK:       # %bb.0:313; CHECK-NEXT:    l %r2, 0(%r3)314; CHECK-NEXT:    j .LBB12_2315; CHECK-NEXT:  .LBB12_1: # %atomicrmw.start316; CHECK-NEXT:    # in Loop: Header=BB12_2 Depth=1317; CHECK-NEXT:    cs %r2, %r0, 0(%r3)318; CHECK-NEXT:    je .LBB12_4319; CHECK-NEXT:  .LBB12_2: # %atomicrmw.start320; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1321; CHECK-NEXT:    lr %r0, %r2322; CHECK-NEXT:    cijl %r2, 43, .LBB12_1323; CHECK-NEXT:  # %bb.3: # %atomicrmw.start324; CHECK-NEXT:    # in Loop: Header=BB12_2 Depth=1325; CHECK-NEXT:    lhi %r0, 42326; CHECK-NEXT:    j .LBB12_1327; CHECK-NEXT:  .LBB12_4: # %atomicrmw.end328; CHECK-NEXT:    br %r14329  %res = atomicrmw min ptr %ptr, i32 42 seq_cst330  ret i32 %res331}332