forked from OSchip/llvm-project
3cb7e7bf95
For the test case in this patch like below struct t { int a; } __attribute__((preserve_access_index)); int foo(void *); int test(struct t *arg) { long param[1]; param[0] = (long)&arg->a; return foo(param); } The IR right before BPF SimplifyPatchable phase: %1:gpr = LD_imm64 @"llvm.t:0:0$0:0" %2:gpr = LDD killed %1:gpr, 0 %3:gpr = ADD_rr %0:gpr(tied-def 0), killed %2:gpr STD killed %3:gpr, %stack.0.param, 0 After SimplifyPatchable phase, the incorrect IR is generated: %1:gpr = LD_imm64 @"llvm.t:0:0$0:0" %3:gpr = ADD_rr %0:gpr(tied-def 0), killed %1:gpr CORE_MEM killed %3:gpr, 306, %0:gpr, @"llvm.t:0:0$0:0" Note that CORE_MEM pseudo op is introduced to encode memory operations related to CORE. In the above, we intend to check whether we have a store like *(%3:gpr + 0) = ... and if this is the case, we could replace it with *(%0:gpr + @"llvm.t:0:0$0:0"_ = ... Unfortunately, in the above, IR for the store is *(%stack.0.param + 0) = %3:gpr and transformation should not happen. Note that we won't have problem if the actual CORE dereference (arg->a) happens. This patch fixed the problem by skip CORE optimization if the use of ADD_rr result is not the base address of the store operation. Differential Revision: https://reviews.llvm.org/D78466 |
||
---|---|---|
.. | ||
field-reloc-alu32.ll | ||
field-reloc-bitfield-1.ll | ||
field-reloc-bitfield-2.ll | ||
intrinsic-array.ll | ||
intrinsic-fieldinfo-byte-size-1.ll | ||
intrinsic-fieldinfo-byte-size-2.ll | ||
intrinsic-fieldinfo-byte-size-3.ll | ||
intrinsic-fieldinfo-byte-size-4.ll | ||
intrinsic-fieldinfo-existence-1.ll | ||
intrinsic-fieldinfo-existence-2.ll | ||
intrinsic-fieldinfo-existence-3.ll | ||
intrinsic-fieldinfo-lshift-1.ll | ||
intrinsic-fieldinfo-lshift-2.ll | ||
intrinsic-fieldinfo-rshift-1.ll | ||
intrinsic-fieldinfo-rshift-2.ll | ||
intrinsic-fieldinfo-rshift-3.ll | ||
intrinsic-fieldinfo-signedness-1.ll | ||
intrinsic-fieldinfo-signedness-2.ll | ||
intrinsic-fieldinfo-signedness-3.ll | ||
intrinsic-struct.ll | ||
intrinsic-transforms.ll | ||
intrinsic-union.ll | ||
no-elf-ama-symbol.ll | ||
no-narrow-load.ll | ||
offset-reloc-access-str.ll | ||
offset-reloc-basic.ll | ||
offset-reloc-cast-array-1.ll | ||
offset-reloc-cast-array-2.ll | ||
offset-reloc-cast-struct-1.ll | ||
offset-reloc-cast-struct-2.ll | ||
offset-reloc-cast-struct-3.ll | ||
offset-reloc-cast-union-1.ll | ||
offset-reloc-cast-union-2.ll | ||
offset-reloc-end-load.ll | ||
offset-reloc-end-ret.ll | ||
offset-reloc-fieldinfo-1.ll | ||
offset-reloc-fieldinfo-2.ll | ||
offset-reloc-global-1.ll | ||
offset-reloc-global-2.ll | ||
offset-reloc-global-3.ll | ||
offset-reloc-ignore.ll | ||
offset-reloc-middle-chain.ll | ||
offset-reloc-multi-array-1.ll | ||
offset-reloc-multi-array-2.ll | ||
offset-reloc-multilevel.ll | ||
offset-reloc-pointer-1.ll | ||
offset-reloc-pointer-2.ll | ||
offset-reloc-struct-anonymous.ll | ||
offset-reloc-struct-array.ll | ||
offset-reloc-typedef-array.ll | ||
offset-reloc-typedef-struct-2.ll | ||
offset-reloc-typedef-struct.ll | ||
offset-reloc-typedef-union-2.ll | ||
offset-reloc-typedef-union.ll | ||
offset-reloc-typedef.ll | ||
offset-reloc-union.ll | ||
store-addr.ll |