166 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S --mtriple=loongarch64 --mattr=+d,+lamcas %s | FileCheck %s --check-prefix=NO-EXPAND3; RUN: opt -S --mtriple=loongarch64 --passes=atomic-expand --mattr=+d,+lamcas %s | FileCheck %s --check-prefix=EXPAND4 5; When -mlamcas is enabled, all atomicrmw and/or/xor ptr %a,a i8/i16 %b ordering 6; will be expanded to am{and/or/xo}[_db].w by LoongArchTargetLowering::emitExpandAtomicRMW7 8define i8 @atomicrmw_and_i8_acquire(ptr %a, i8 %b) nounwind {9; NO-EXPAND-LABEL: define i8 @atomicrmw_and_i8_acquire(10; NO-EXPAND-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0:[0-9]+]] {11; NO-EXPAND-NEXT: [[TMP1:%.*]] = atomicrmw and ptr [[A]], i8 [[B]] acquire, align 112; NO-EXPAND-NEXT: ret i8 [[TMP1]]13;14; EXPAND-LABEL: define i8 @atomicrmw_and_i8_acquire(15; EXPAND-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0:[0-9]+]] {16; EXPAND-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[A]], i64 -4)17; EXPAND-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[A]] to i6418; EXPAND-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 319; EXPAND-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 320; EXPAND-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3221; EXPAND-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]22; EXPAND-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -123; EXPAND-NEXT: [[TMP3:%.*]] = zext i8 [[B]] to i3224; EXPAND-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]25; EXPAND-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]26; EXPAND-NEXT: [[TMP4:%.*]] = atomicrmw and ptr [[ALIGNEDADDR]], i32 [[ANDOPERAND]] acquire, align 427; EXPAND-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]28; EXPAND-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i829; EXPAND-NEXT: ret i8 [[EXTRACTED]]30;31 %1 = atomicrmw and ptr %a, i8 %b acquire32 ret i8 %133}34 35define i16 @atomicrmw_and_i16_acquire(ptr %a, i16 %b) nounwind {36; NO-EXPAND-LABEL: define i16 @atomicrmw_and_i16_acquire(37; NO-EXPAND-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {38; NO-EXPAND-NEXT: [[TMP1:%.*]] = atomicrmw and ptr [[A]], i16 [[B]] acquire, align 239; NO-EXPAND-NEXT: ret i16 [[TMP1]]40;41; EXPAND-LABEL: define i16 @atomicrmw_and_i16_acquire(42; EXPAND-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {43; EXPAND-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[A]], i64 -4)44; EXPAND-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[A]] to i6445; EXPAND-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 346; EXPAND-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 347; EXPAND-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3248; EXPAND-NEXT: [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]49; EXPAND-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -150; EXPAND-NEXT: [[TMP3:%.*]] = zext i16 [[B]] to i3251; EXPAND-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]52; EXPAND-NEXT: [[ANDOPERAND:%.*]] = or i32 [[VALOPERAND_SHIFTED]], [[INV_MASK]]53; EXPAND-NEXT: [[TMP4:%.*]] = atomicrmw and ptr [[ALIGNEDADDR]], i32 [[ANDOPERAND]] acquire, align 454; EXPAND-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]55; EXPAND-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i1656; EXPAND-NEXT: ret i16 [[EXTRACTED]]57;58 %1 = atomicrmw and ptr %a, i16 %b acquire59 ret i16 %160 61}62 63define i8 @atomicrmw_or_i8_acquire(ptr %a, i8 %b) nounwind {64; NO-EXPAND-LABEL: define i8 @atomicrmw_or_i8_acquire(65; NO-EXPAND-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {66; NO-EXPAND-NEXT: [[TMP1:%.*]] = atomicrmw or ptr [[A]], i8 [[B]] acquire, align 167; NO-EXPAND-NEXT: ret i8 [[TMP1]]68;69; EXPAND-LABEL: define i8 @atomicrmw_or_i8_acquire(70; EXPAND-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {71; EXPAND-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[A]], i64 -4)72; EXPAND-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[A]] to i6473; EXPAND-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 374; EXPAND-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 375; EXPAND-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i3276; EXPAND-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]77; EXPAND-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -178; EXPAND-NEXT: [[TMP3:%.*]] = zext i8 [[B]] to i3279; EXPAND-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]80; EXPAND-NEXT: [[TMP4:%.*]] = atomicrmw or ptr [[ALIGNEDADDR]], i32 [[VALOPERAND_SHIFTED]] acquire, align 481; EXPAND-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]82; EXPAND-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i883; EXPAND-NEXT: ret i8 [[EXTRACTED]]84;85 %1 = atomicrmw or ptr %a, i8 %b acquire86 ret i8 %187}88 89define i16 @atomicrmw_or_i16_acquire(ptr %a, i16 %b) nounwind {90; NO-EXPAND-LABEL: define i16 @atomicrmw_or_i16_acquire(91; NO-EXPAND-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {92; NO-EXPAND-NEXT: [[TMP1:%.*]] = atomicrmw or ptr [[A]], i16 [[B]] acquire, align 293; NO-EXPAND-NEXT: ret i16 [[TMP1]]94;95; EXPAND-LABEL: define i16 @atomicrmw_or_i16_acquire(96; EXPAND-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {97; EXPAND-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[A]], i64 -4)98; EXPAND-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[A]] to i6499; EXPAND-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3100; EXPAND-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3101; EXPAND-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32102; EXPAND-NEXT: [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]103; EXPAND-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1104; EXPAND-NEXT: [[TMP3:%.*]] = zext i16 [[B]] to i32105; EXPAND-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]106; EXPAND-NEXT: [[TMP4:%.*]] = atomicrmw or ptr [[ALIGNEDADDR]], i32 [[VALOPERAND_SHIFTED]] acquire, align 4107; EXPAND-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]108; EXPAND-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16109; EXPAND-NEXT: ret i16 [[EXTRACTED]]110;111 %1 = atomicrmw or ptr %a, i16 %b acquire112 ret i16 %1113}114 115define i8 @atomicrmw_xor_i8_acquire(ptr %a, i8 %b) nounwind {116; NO-EXPAND-LABEL: define i8 @atomicrmw_xor_i8_acquire(117; NO-EXPAND-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {118; NO-EXPAND-NEXT: [[TMP1:%.*]] = atomicrmw xor ptr [[A]], i8 [[B]] acquire, align 1119; NO-EXPAND-NEXT: ret i8 [[TMP1]]120;121; EXPAND-LABEL: define i8 @atomicrmw_xor_i8_acquire(122; EXPAND-SAME: ptr [[A:%.*]], i8 [[B:%.*]]) #[[ATTR0]] {123; EXPAND-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[A]], i64 -4)124; EXPAND-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[A]] to i64125; EXPAND-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3126; EXPAND-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3127; EXPAND-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32128; EXPAND-NEXT: [[MASK:%.*]] = shl i32 255, [[SHIFTAMT]]129; EXPAND-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1130; EXPAND-NEXT: [[TMP3:%.*]] = zext i8 [[B]] to i32131; EXPAND-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]132; EXPAND-NEXT: [[TMP4:%.*]] = atomicrmw xor ptr [[ALIGNEDADDR]], i32 [[VALOPERAND_SHIFTED]] acquire, align 4133; EXPAND-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]134; EXPAND-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i8135; EXPAND-NEXT: ret i8 [[EXTRACTED]]136;137 %1 = atomicrmw xor ptr %a, i8 %b acquire138 ret i8 %1139}140 141define i16 @atomicrmw_xor_i16_acquire(ptr %a, i16 %b) nounwind {142; NO-EXPAND-LABEL: define i16 @atomicrmw_xor_i16_acquire(143; NO-EXPAND-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {144; NO-EXPAND-NEXT: [[TMP1:%.*]] = atomicrmw xor ptr [[A]], i16 [[B]] acquire, align 2145; NO-EXPAND-NEXT: ret i16 [[TMP1]]146;147; EXPAND-LABEL: define i16 @atomicrmw_xor_i16_acquire(148; EXPAND-SAME: ptr [[A:%.*]], i16 [[B:%.*]]) #[[ATTR0]] {149; EXPAND-NEXT: [[ALIGNEDADDR:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[A]], i64 -4)150; EXPAND-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[A]] to i64151; EXPAND-NEXT: [[PTRLSB:%.*]] = and i64 [[TMP1]], 3152; EXPAND-NEXT: [[TMP2:%.*]] = shl i64 [[PTRLSB]], 3153; EXPAND-NEXT: [[SHIFTAMT:%.*]] = trunc i64 [[TMP2]] to i32154; EXPAND-NEXT: [[MASK:%.*]] = shl i32 65535, [[SHIFTAMT]]155; EXPAND-NEXT: [[INV_MASK:%.*]] = xor i32 [[MASK]], -1156; EXPAND-NEXT: [[TMP3:%.*]] = zext i16 [[B]] to i32157; EXPAND-NEXT: [[VALOPERAND_SHIFTED:%.*]] = shl i32 [[TMP3]], [[SHIFTAMT]]158; EXPAND-NEXT: [[TMP4:%.*]] = atomicrmw xor ptr [[ALIGNEDADDR]], i32 [[VALOPERAND_SHIFTED]] acquire, align 4159; EXPAND-NEXT: [[SHIFTED:%.*]] = lshr i32 [[TMP4]], [[SHIFTAMT]]160; EXPAND-NEXT: [[EXTRACTED:%.*]] = trunc i32 [[SHIFTED]] to i16161; EXPAND-NEXT: ret i16 [[EXTRACTED]]162;163 %1 = atomicrmw xor ptr %a, i16 %b acquire164 ret i16 %1165}166