brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · 9352118 Raw
257 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; Test 64-bit atomic minimum and maximum.  Here we match the z10 versions,3; which can't use LOCGR.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 i64 @f1(i64 %dummy, ptr %src, i64 %b) {11; CHECK-LABEL: f1:12; CHECK:       # %bb.0:13; CHECK-NEXT:    lg %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:    csg %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:    lgr %r0, %r222; CHECK-NEXT:    cgrjle %r2, %r4, .LBB0_123; CHECK-NEXT:  # %bb.3: # %atomicrmw.start24; CHECK-NEXT:    # in Loop: Header=BB0_2 Depth=125; CHECK-NEXT:    lgr %r0, %r426; CHECK-NEXT:    j .LBB0_127; CHECK-NEXT:  .LBB0_4: # %atomicrmw.end28; CHECK-NEXT:    br %r1429  %res = atomicrmw min ptr %src, i64 %b seq_cst30  ret i64 %res31}32 33; Check signed maximum.34define i64 @f2(i64 %dummy, ptr %src, i64 %b) {35; CHECK-LABEL: f2:36; CHECK:       # %bb.0:37; CHECK-NEXT:    lg %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:    csg %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:    lgr %r0, %r246; CHECK-NEXT:    cgrjh %r2, %r4, .LBB1_147; CHECK-NEXT:  # %bb.3: # %atomicrmw.start48; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=149; CHECK-NEXT:    lgr %r0, %r450; CHECK-NEXT:    j .LBB1_151; CHECK-NEXT:  .LBB1_4: # %atomicrmw.end52; CHECK-NEXT:    br %r1453  %res = atomicrmw max ptr %src, i64 %b seq_cst54  ret i64 %res55}56 57; Check unsigned minimum.58define i64 @f3(i64 %dummy, ptr %src, i64 %b) {59; CHECK-LABEL: f3:60; CHECK:       # %bb.0:61; CHECK-NEXT:    lg %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:    csg %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:    lgr %r0, %r270; CHECK-NEXT:    clgrjle %r2, %r4, .LBB2_171; CHECK-NEXT:  # %bb.3: # %atomicrmw.start72; CHECK-NEXT:    # in Loop: Header=BB2_2 Depth=173; CHECK-NEXT:    lgr %r0, %r474; CHECK-NEXT:    j .LBB2_175; CHECK-NEXT:  .LBB2_4: # %atomicrmw.end76; CHECK-NEXT:    br %r1477  %res = atomicrmw umin ptr %src, i64 %b seq_cst78  ret i64 %res79}80 81; Check unsigned maximum.82define i64 @f4(i64 %dummy, ptr %src, i64 %b) {83; CHECK-LABEL: f4:84; CHECK:       # %bb.0:85; CHECK-NEXT:    lg %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:    csg %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:    lgr %r0, %r294; CHECK-NEXT:    clgrjh %r2, %r4, .LBB3_195; CHECK-NEXT:  # %bb.3: # %atomicrmw.start96; CHECK-NEXT:    # in Loop: Header=BB3_2 Depth=197; CHECK-NEXT:    lgr %r0, %r498; CHECK-NEXT:    j .LBB3_199; CHECK-NEXT:  .LBB3_4: # %atomicrmw.end100; CHECK-NEXT:    br %r14101  %res = atomicrmw umax ptr %src, i64 %b seq_cst102  ret i64 %res103}104 105; Check the high end of the aligned CSG range.106define i64 @f5(i64 %dummy, ptr %src, i64 %b) {107; CHECK-LABEL: f5:108; CHECK:       # %bb.0:109; CHECK-NEXT:    lg %r2, 524280(%r3)110; CHECK-NEXT:    j .LBB4_2111; CHECK-NEXT:  .LBB4_1: # %atomicrmw.start112; CHECK-NEXT:    # in Loop: Header=BB4_2 Depth=1113; CHECK-NEXT:    csg %r2, %r0, 524280(%r3)114; CHECK-NEXT:    je .LBB4_4115; CHECK-NEXT:  .LBB4_2: # %atomicrmw.start116; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1117; CHECK-NEXT:    lgr %r0, %r2118; CHECK-NEXT:    cgrjle %r2, %r4, .LBB4_1119; CHECK-NEXT:  # %bb.3: # %atomicrmw.start120; CHECK-NEXT:    # in Loop: Header=BB4_2 Depth=1121; CHECK-NEXT:    lgr %r0, %r4122; CHECK-NEXT:    j .LBB4_1123; CHECK-NEXT:  .LBB4_4: # %atomicrmw.end124; CHECK-NEXT:    br %r14125  %ptr = getelementptr i64, ptr %src, i64 65535126  %res = atomicrmw min ptr %ptr, i64 %b seq_cst127  ret i64 %res128}129 130; Check the next doubleword up, which requires separate address logic.131define i64 @f6(i64 %dummy, ptr %src, i64 %b) {132; CHECK-LABEL: f6:133; CHECK:       # %bb.0:134; CHECK-NEXT:    agfi %r3, 524288135; CHECK-NEXT:    lg %r2, 0(%r3)136; CHECK-NEXT:    j .LBB5_2137; CHECK-NEXT:  .LBB5_1: # %atomicrmw.start138; CHECK-NEXT:    # in Loop: Header=BB5_2 Depth=1139; CHECK-NEXT:    csg %r2, %r0, 0(%r3)140; CHECK-NEXT:    je .LBB5_4141; CHECK-NEXT:  .LBB5_2: # %atomicrmw.start142; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1143; CHECK-NEXT:    lgr %r0, %r2144; CHECK-NEXT:    cgrjle %r2, %r4, .LBB5_1145; CHECK-NEXT:  # %bb.3: # %atomicrmw.start146; CHECK-NEXT:    # in Loop: Header=BB5_2 Depth=1147; CHECK-NEXT:    lgr %r0, %r4148; CHECK-NEXT:    j .LBB5_1149; CHECK-NEXT:  .LBB5_4: # %atomicrmw.end150; CHECK-NEXT:    br %r14151  %ptr = getelementptr i64, ptr %src, i64 65536152  %res = atomicrmw min ptr %ptr, i64 %b seq_cst153  ret i64 %res154}155 156; Check the low end of the CSG range.157define i64 @f7(i64 %dummy, ptr %src, i64 %b) {158; CHECK-LABEL: f7:159; CHECK:       # %bb.0:160; CHECK-NEXT:    lg %r2, -524288(%r3)161; CHECK-NEXT:    j .LBB6_2162; CHECK-NEXT:  .LBB6_1: # %atomicrmw.start163; CHECK-NEXT:    # in Loop: Header=BB6_2 Depth=1164; CHECK-NEXT:    csg %r2, %r0, -524288(%r3)165; CHECK-NEXT:    je .LBB6_4166; CHECK-NEXT:  .LBB6_2: # %atomicrmw.start167; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1168; CHECK-NEXT:    lgr %r0, %r2169; CHECK-NEXT:    cgrjle %r2, %r4, .LBB6_1170; CHECK-NEXT:  # %bb.3: # %atomicrmw.start171; CHECK-NEXT:    # in Loop: Header=BB6_2 Depth=1172; CHECK-NEXT:    lgr %r0, %r4173; CHECK-NEXT:    j .LBB6_1174; CHECK-NEXT:  .LBB6_4: # %atomicrmw.end175; CHECK-NEXT:    br %r14176  %ptr = getelementptr i64, ptr %src, i64 -65536177  %res = atomicrmw min ptr %ptr, i64 %b seq_cst178  ret i64 %res179}180 181; Check the next doubleword down, which requires separate address logic.182define i64 @f8(i64 %dummy, ptr %src, i64 %b) {183; CHECK-LABEL: f8:184; CHECK:       # %bb.0:185; CHECK-NEXT:    agfi %r3, -524296186; CHECK-NEXT:    lg %r2, 0(%r3)187; CHECK-NEXT:    j .LBB7_2188; CHECK-NEXT:  .LBB7_1: # %atomicrmw.start189; CHECK-NEXT:    # in Loop: Header=BB7_2 Depth=1190; CHECK-NEXT:    csg %r2, %r0, 0(%r3)191; CHECK-NEXT:    je .LBB7_4192; CHECK-NEXT:  .LBB7_2: # %atomicrmw.start193; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1194; CHECK-NEXT:    lgr %r0, %r2195; CHECK-NEXT:    cgrjle %r2, %r4, .LBB7_1196; CHECK-NEXT:  # %bb.3: # %atomicrmw.start197; CHECK-NEXT:    # in Loop: Header=BB7_2 Depth=1198; CHECK-NEXT:    lgr %r0, %r4199; CHECK-NEXT:    j .LBB7_1200; CHECK-NEXT:  .LBB7_4: # %atomicrmw.end201; CHECK-NEXT:    br %r14202  %ptr = getelementptr i64, ptr %src, i64 -65537203  %res = atomicrmw min ptr %ptr, i64 %b seq_cst204  ret i64 %res205}206 207; Check that indexed addresses are not allowed.208define i64 @f9(i64 %dummy, i64 %base, i64 %index, i64 %b) {209; CHECK-LABEL: f9:210; CHECK:       # %bb.0:211; CHECK-NEXT:    lg %r2, 0(%r4,%r3)212; CHECK-NEXT:    agr %r3, %r4213; CHECK-NEXT:    j .LBB8_2214; CHECK-NEXT:  .LBB8_1: # %atomicrmw.start215; CHECK-NEXT:    # in Loop: Header=BB8_2 Depth=1216; CHECK-NEXT:    csg %r2, %r0, 0(%r3)217; CHECK-NEXT:    je .LBB8_4218; CHECK-NEXT:  .LBB8_2: # %atomicrmw.start219; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1220; CHECK-NEXT:    lgr %r0, %r2221; CHECK-NEXT:    cgrjle %r2, %r5, .LBB8_1222; CHECK-NEXT:  # %bb.3: # %atomicrmw.start223; CHECK-NEXT:    # in Loop: Header=BB8_2 Depth=1224; CHECK-NEXT:    lgr %r0, %r5225; CHECK-NEXT:    j .LBB8_1226; CHECK-NEXT:  .LBB8_4: # %atomicrmw.end227; CHECK-NEXT:    br %r14228  %add = add i64 %base, %index229  %ptr = inttoptr i64 %add to ptr230  %res = atomicrmw min ptr %ptr, i64 %b seq_cst231  ret i64 %res232}233 234; Check that constants are handled.235define i64 @f10(i64 %dummy, ptr %ptr) {236; CHECK-LABEL: f10:237; CHECK:       # %bb.0:238; CHECK-NEXT:    lg %r2, 0(%r3)239; CHECK-NEXT:    j .LBB9_2240; CHECK-NEXT:  .LBB9_1: # %atomicrmw.start241; CHECK-NEXT:    # in Loop: Header=BB9_2 Depth=1242; CHECK-NEXT:    csg %r2, %r0, 0(%r3)243; CHECK-NEXT:    je .LBB9_4244; CHECK-NEXT:  .LBB9_2: # %atomicrmw.start245; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1246; CHECK-NEXT:    lgr %r0, %r2247; CHECK-NEXT:    cgijl %r2, 43, .LBB9_1248; CHECK-NEXT:  # %bb.3: # %atomicrmw.start249; CHECK-NEXT:    # in Loop: Header=BB9_2 Depth=1250; CHECK-NEXT:    lghi %r0, 42251; CHECK-NEXT:    j .LBB9_1252; CHECK-NEXT:  .LBB9_4: # %atomicrmw.end253; CHECK-NEXT:    br %r14254  %res = atomicrmw min ptr %ptr, i64 42 seq_cst255  ret i64 %res256}257