mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Fix the folding of multiplication into addresses on x86, which was broken
by the recent {U,S}MUL_LOHI changes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43230 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3311876c3c
commit
8368805e25
@ -681,6 +681,11 @@ bool X86DAGToDAGISel::MatchAddress(SDOperand N, X86ISelAddressMode &AM,
|
||||
}
|
||||
break;
|
||||
|
||||
case ISD::SMUL_LOHI:
|
||||
case ISD::UMUL_LOHI:
|
||||
// A mul_lohi where we need the low part can be folded as a plain multiply.
|
||||
if (N.ResNo != 0) break;
|
||||
// FALL THROUGH
|
||||
case ISD::MUL:
|
||||
// X*[3,5,9] -> X+X*[2,4,8]
|
||||
if (!Available &&
|
||||
|
30
test/CodeGen/X86/fold-mul-lohi.ll
Normal file
30
test/CodeGen/X86/fold-mul-lohi.ll
Normal file
@ -0,0 +1,30 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 | not grep lea
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 | not grep lea
|
||||
|
||||
@B = external global [1000 x i8], align 32
|
||||
@A = external global [1000 x i8], align 32
|
||||
@P = external global [1000 x i8], align 32
|
||||
|
||||
define void @foo(i32 %m) {
|
||||
entry:
|
||||
%tmp1 = icmp sgt i32 %m, 0
|
||||
br i1 %tmp1, label %bb, label %return
|
||||
|
||||
bb:
|
||||
%i.019.0 = phi i32 [ %indvar.next, %bb ], [ 0, %entry ]
|
||||
%tmp2 = getelementptr [1000 x i8]* @B, i32 0, i32 %i.019.0
|
||||
%tmp3 = load i8* %tmp2, align 4
|
||||
%tmp4 = mul i8 %tmp3, 2
|
||||
%tmp5 = getelementptr [1000 x i8]* @A, i32 0, i32 %i.019.0
|
||||
store i8 %tmp4, i8* %tmp5, align 4
|
||||
%tmp8 = mul i32 %i.019.0, 9
|
||||
%tmp10 = getelementptr [1000 x i8]* @P, i32 0, i32 %tmp8
|
||||
store i8 17, i8* %tmp10, align 4
|
||||
%indvar.next = add i32 %i.019.0, 1
|
||||
%exitcond = icmp eq i32 %indvar.next, %m
|
||||
br i1 %exitcond, label %return, label %bb
|
||||
|
||||
return:
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user