mirror of
https://github.com/intel/llvm.git
synced 2026-01-24 08:30:34 +08:00
[TwoAddressInstructionPass] When looking for a 3 addr conversion after commuting, make sure regB has been updated to take into account the commute.
llvm-svn: 249378
This commit is contained in:
@@ -1265,6 +1265,13 @@ tryInstructionTransform(MachineBasicBlock::iterator &mi,
|
||||
return true;
|
||||
}
|
||||
|
||||
// If we commuted, regB may have changed so we should re-sample it to avoid
|
||||
// confusing the three address conversion below.
|
||||
if (Commuted) {
|
||||
regB = MI.getOperand(SrcIdx).getReg();
|
||||
regBKilled = isKilled(MI, regB, MRI, TII, LIS, true);
|
||||
}
|
||||
|
||||
if (MI.isConvertibleTo3Addr()) {
|
||||
// This instruction is potentially convertible to a true
|
||||
// three-address instruction. Check if it is profitable.
|
||||
|
||||
@@ -210,8 +210,8 @@ define i32 @add_32r_ret_load(i32* %p, i32 %v) {
|
||||
; X64-LABEL: add_32r_ret_load:
|
||||
; X64-NOT: lock
|
||||
; X64: movl (%rdi), %eax
|
||||
; X64-NEXT: leal (%rsi,%rax), %ecx
|
||||
; X64-NEXT: movl %ecx, (%rdi)
|
||||
; X64-NEXT: addl %eax, %esi
|
||||
; X64-NEXT: movl %esi, (%rdi)
|
||||
; X64-NEXT: retq
|
||||
; X32-LABEL: add_32r_ret_load:
|
||||
; X32-NOT: lock
|
||||
|
||||
@@ -39,7 +39,7 @@ define %0 @t3(i32 %lb, i8 zeroext %has_lb, i8 zeroext %lb_inclusive, i32 %ub, i8
|
||||
entry:
|
||||
; DARWIN-LABEL: t3:
|
||||
; DARWIN: shlq $32, %rcx
|
||||
; DARWIN-NEXT: leaq (%rax,%rcx), %rax
|
||||
; DARWIN-NEXT: orq %rcx, %rax
|
||||
; DARWIN-NEXT: shll $8
|
||||
; DARWIN-NOT: leaq
|
||||
%tmp21 = zext i32 %lb to i64
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
; X32: add
|
||||
; X32: add
|
||||
; X32: add
|
||||
; X32: leal
|
||||
; X32: add
|
||||
; X32: %for.body.3
|
||||
define void @sharedidx(i8* nocapture %a, i8* nocapture %b, i8* nocapture %c, i32 %s, i32 %len) nounwind ssp {
|
||||
entry:
|
||||
|
||||
Reference in New Issue
Block a user