From: Krzysztof Parzyszek Date: Fri, 15 Dec 2017 20:13:57 +0000 (+0000) Subject: [Hexagon] Fix operand-swapping PatFrag for atomic stores X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f1c8b170f5cc7b0a2f41af13a9a2326587e0118a;p=llvm [Hexagon] Fix operand-swapping PatFrag for atomic stores PatFrag now has the atomicity information stored as bit fields. They need to be copied to the new PatFrag. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@320855 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Hexagon/HexagonPatterns.td b/lib/Target/Hexagon/HexagonPatterns.td index 8ed9a8d01ce..05c8f871bdd 100644 --- a/lib/Target/Hexagon/HexagonPatterns.td +++ b/lib/Target/Hexagon/HexagonPatterns.td @@ -2142,9 +2142,13 @@ class Stoream_pat +class AtomSt : PatFrag<(ops node:$val, node:$ptr), F.Fragment, F.PredicateCode, - F.OperandTransform>; + F.OperandTransform> { + let IsAtomic = F.IsAtomic; + let MemoryVT = F.MemoryVT; +} + def IMM_BYTE : SDNodeXForm; def: Storea_pat; def: Storea_pat; - def: Storea_pat, I32, addrgp, S2_storerbgp>; - def: Storea_pat, I32, addrgp, S2_storerhgp>; - def: Storea_pat, I32, addrgp, S2_storerigp>; - def: Storea_pat, I64, addrgp, S2_storerdgp>; + def: Storea_pat, I32, addrgp, S2_storerbgp>; + def: Storea_pat, I32, addrgp, S2_storerhgp>; + def: Storea_pat, I32, addrgp, S2_storerigp>; + def: Storea_pat, I64, addrgp, S2_storerdgp>; def: Stoream_pat; def: Stoream_pat; @@ -2280,10 +2284,10 @@ let AddedComplexity = 110 in { def: Storea_pat; def: Storea_pat; def: Storea_pat; - def: Storea_pat, I32, anyimm0, PS_storerbabs>; - def: Storea_pat, I32, anyimm1, PS_storerhabs>; - def: Storea_pat, I32, anyimm2, PS_storeriabs>; - def: Storea_pat, I64, anyimm3, PS_storerdabs>; + def: Storea_pat, I32, anyimm0, PS_storerbabs>; + def: Storea_pat, I32, anyimm1, PS_storerhabs>; + def: Storea_pat, I32, anyimm2, PS_storeriabs>; + def: Storea_pat, I64, anyimm3, PS_storerdabs>; def: Stoream_pat; def: Stoream_pat; @@ -2413,10 +2417,10 @@ let AddedComplexity = 40 in { defm: Storexim_pat; defm: Storexim_pat; - defm: Storexi_pat, I32, anyimm0, S2_storerb_io>; - defm: Storexi_pat, I32, anyimm1, S2_storerh_io>; - defm: Storexi_pat, I32, anyimm2, S2_storeri_io>; - defm: Storexi_pat, I64, anyimm3, S2_storerd_io>; + defm: Storexi_pat, I32, anyimm0, S2_storerb_io>; + defm: Storexi_pat, I32, anyimm1, S2_storerh_io>; + defm: Storexi_pat, I32, anyimm2, S2_storeri_io>; + defm: Storexi_pat, I64, anyimm3, S2_storerd_io>; } // Reg+Reg @@ -2457,10 +2461,10 @@ let AddedComplexity = 10 in { def: Storexim_base_pat; def: Storexim_base_pat; - def: Storexi_base_pat, I32, S2_storerb_io>; - def: Storexi_base_pat, I32, S2_storerh_io>; - def: Storexi_base_pat, I32, S2_storeri_io>; - def: Storexi_base_pat, I64, S2_storerd_io>; + def: Storexi_base_pat, I32, S2_storerb_io>; + def: Storexi_base_pat, I32, S2_storerh_io>; + def: Storexi_base_pat, I32, S2_storeri_io>; + def: Storexi_base_pat, I64, S2_storerd_io>; } // HVX stores diff --git a/test/CodeGen/Hexagon/intrinsics/atomic_store.ll b/test/CodeGen/Hexagon/intrinsics/atomic_store.ll new file mode 100644 index 00000000000..23865994db2 --- /dev/null +++ b/test/CodeGen/Hexagon/intrinsics/atomic_store.ll @@ -0,0 +1,68 @@ +; RUN: sed -e "s/ORDER/unordered/" %s | llc -march=hexagon | FileCheck %s +; RUN: sed -e "s/ORDER/monotonic/" %s | llc -march=hexagon | FileCheck %s +; RUN: sed -e "s/ORDER/release/" %s | llc -march=hexagon | FileCheck %s +; RUN: sed -e "s/ORDER/seq_cst/" %s | llc -march=hexagon | FileCheck %s + +%struct.Obj = type { [100 x i32] } + +@i8Src = global i8 0, align 1 +@i8Dest = global i8 0, align 1 +@i16Src = global i16 0, align 2 +@i16Dest = global i16 0, align 2 +@i32Src = global i32 0, align 4 +@i32Dest = global i32 0, align 4 +@i64Src = global i64 0, align 8 +@i64Dest = global i64 0, align 8 +@ptrSrc = global %struct.Obj* null, align 4 +@ptrDest = global %struct.Obj* null, align 4 + +define void @store_i8() #0 { +entry: + %i8Tmp = load i8, i8* @i8Src, align 1 + store atomic i8 %i8Tmp, i8* @i8Dest ORDER, align 1 + ret void +} +; CHECK-LABEL: store_i8: +; CHECK: [[TMP_REG:r[0-9]+]] = memub(gp+#i8Src) +; CHECK: memb(gp+#i8Dest) = [[TMP_REG]] + +define void @store_i16() #0 { +entry: + %i16Tmp = load i16, i16* @i16Src, align 2 + store atomic i16 %i16Tmp, i16* @i16Dest ORDER, align 2 + ret void +} +; CHECK-LABEL: store_i16: +; CHECK: [[TMP_REG:r[0-9]+]] = memuh(gp+#i16Src) +; CHECK: memh(gp+#i16Dest) = [[TMP_REG]] + +define void @store_i32() #0 { +entry: + %i32Tmp = load i32, i32* @i32Src, align 4 + store atomic i32 %i32Tmp, i32* @i32Dest ORDER, align 4 + ret void +} +; CHECK-LABEL: store_i32: +; CHECK: [[TMP_REG:r[0-9]+]] = memw(gp+#i32Src) +; CHECK: memw(gp+#i32Dest) = [[TMP_REG]] + +define void @store_i64() #0 { +entry: + %i64Tmp = load i64, i64* @i64Src, align 8 + store atomic i64 %i64Tmp, i64* @i64Dest ORDER, align 8 + ret void +} +; CHECK-LABEL: store_i64: +; CHECK: [[TMP_REG:r[0-9]+:[0-9]+]] = memd(gp+#i64Src) +; CHECK: memd(gp+#i64Dest) = [[TMP_REG]] + +define void @store_ptr() #0 { +entry: + %ptrTmp = load i32, i32* bitcast (%struct.Obj** @ptrSrc to i32*), align 4 + store atomic i32 %ptrTmp, i32* bitcast (%struct.Obj** @ptrDest to i32*) ORDER, align 4 + ret void +} +; CHECK-LABEL: store_ptr: +; CHECK: [[TMP_REG:r[0-9]+]] = memw(gp+#ptrSrc) +; CHECK: memw(gp+#ptrDest) = [[TMP_REG]] +