2016-08-04 02:17:35 +08:00
|
|
|
; RUN: llc -verify-machineinstrs <%s | FileCheck %s
|
[PR27390] [CodeGen] Reject indexed loads in CombinerDAG.
visitAND, when folding and (load) forgets to check which output of
an indexed load is involved, happily folding the updated address
output on the following testcase:
target datalayout = "e-m:e-i64:64-n32:64"
target triple = "powerpc64le-unknown-linux-gnu"
%typ = type { i32, i32 }
define signext i32 @_Z8access_pP1Tc(%typ* %p, i8 zeroext %type) {
%b = getelementptr inbounds %typ, %typ* %p, i64 0, i32 1
%1 = load i32, i32* %b, align 4
%2 = ptrtoint i32* %b to i64
%3 = and i64 %2, -35184372088833
%4 = inttoptr i64 %3 to i32*
%_msld = load i32, i32* %4, align 4
%zzz = add i32 %1, %_msld
ret i32 %zzz
}
Fix this by checking ResNo.
I've found a few more places that currently neglect to check for
indexed load, and tightened them up as well, but I don't have test
cases for them. In fact, they might not be triggerable at all,
at least with current targets. Still, better safe than sorry.
Differential Revision: http://reviews.llvm.org/D19202
llvm-svn: 267420
2016-04-25 23:43:44 +08:00
|
|
|
target datalayout = "e-m:e-i64:64-n32:64"
|
|
|
|
target triple = "powerpc64le-unknown-linux-gnu"
|
|
|
|
|
|
|
|
; PR27390 crasher
|
|
|
|
|
|
|
|
%typ = type { i32, i32 }
|
|
|
|
|
|
|
|
; On release builds, it doesn't crash, spewing nonsense instead.
|
[PowerPC] Exploit the rldicl + rldicl when and with mask
If we are and the constant like 0xFFFFFFC00000, for now, we are using several
instructions to generate this 48bit constant and final an "and". However, we
could exploit it with two rotate instructions.
MB ME MB+63-ME
+----------------------+ +----------------------+
|0000001111111111111000| -> |0000000001111111111111|
+----------------------+ +----------------------+
0 63 0 63
Rotate left ME + 1 bit first, and then, mask it with (MB + 63 - ME, 63),
finally, rotate back. Notice that, we need to round it with 64 bit for the
wrapping case.
Reviewed by: ChenZheng, Nemanjai
Differential Revision: https://reviews.llvm.org/D71831
2020-04-17 13:24:00 +08:00
|
|
|
; To make sure it works, check that rldicl is still alive.
|
|
|
|
; CHECK: rldicl
|
[PR27390] [CodeGen] Reject indexed loads in CombinerDAG.
visitAND, when folding and (load) forgets to check which output of
an indexed load is involved, happily folding the updated address
output on the following testcase:
target datalayout = "e-m:e-i64:64-n32:64"
target triple = "powerpc64le-unknown-linux-gnu"
%typ = type { i32, i32 }
define signext i32 @_Z8access_pP1Tc(%typ* %p, i8 zeroext %type) {
%b = getelementptr inbounds %typ, %typ* %p, i64 0, i32 1
%1 = load i32, i32* %b, align 4
%2 = ptrtoint i32* %b to i64
%3 = and i64 %2, -35184372088833
%4 = inttoptr i64 %3 to i32*
%_msld = load i32, i32* %4, align 4
%zzz = add i32 %1, %_msld
ret i32 %zzz
}
Fix this by checking ResNo.
I've found a few more places that currently neglect to check for
indexed load, and tightened them up as well, but I don't have test
cases for them. In fact, they might not be triggerable at all,
at least with current targets. Still, better safe than sorry.
Differential Revision: http://reviews.llvm.org/D19202
llvm-svn: 267420
2016-04-25 23:43:44 +08:00
|
|
|
; Also, in release, it emits a COPY from a 32-bit register to
|
|
|
|
; a 64-bit register, which happens to be emitted as cror [!]
|
|
|
|
; by the confused CodeGen. Just to be sure, check there isn't one.
|
|
|
|
; CHECK-NOT: cror
|
|
|
|
; Function Attrs: uwtable
|
|
|
|
define signext i32 @_Z8access_pP1Tc(%typ* %p, i8 zeroext %type) {
|
|
|
|
%b = getelementptr inbounds %typ, %typ* %p, i64 0, i32 1
|
|
|
|
%1 = load i32, i32* %b, align 4
|
|
|
|
%2 = ptrtoint i32* %b to i64
|
|
|
|
%3 = and i64 %2, -35184372088833
|
|
|
|
%4 = inttoptr i64 %3 to i32*
|
|
|
|
%_msld = load i32, i32* %4, align 4
|
|
|
|
%zzz = add i32 %1, %_msld
|
|
|
|
ret i32 %zzz
|
|
|
|
}
|