Files
clang-p2996/llvm/test/CodeGen/Hexagon/isel-global-offset-alignment.ll
David Green 4ce26deac2 [DAG] Reassociate Add with Or
We already have reassociation code for Adds and Ors separately in DAG
combiner, this adds it for the combination of the two where Ors act like
Adds. It reassociates (add (or (x, c), y) -> (add (add (x, y), c)) where
we know that the Ors operands have no common bits set, and the Or has
one use.

Differential Revision: https://reviews.llvm.org/D104765
2021-07-07 10:21:07 +01:00

47 lines
1.5 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -march=hexagon < %s | FileCheck %s
; This should compile without errors, and the offsets with respect to the
; beginning of the global "array" don't need to be multiples of 8.
target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
target triple = "hexagon"
@array = external global [1000000 x i16], align 8
define void @fred(i1 %x) #0 {
; CHECK-LABEL: fred:
; CHECK: // %bb.0: // %b0
; CHECK-NEXT: {
; CHECK-NEXT: p0 = tstbit(r0,#0)
; CHECK-NEXT: if (!p0.new) r2 = #1024
; CHECK-NEXT: if (p0.new) r2 = #0
; CHECK-NEXT: r5:4 = combine(#0,#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: memd(r2+##array+184) = r5:4
; CHECK-NEXT: memd(r2+##array+176) = r5:4
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: jumpr r31
; CHECK-NEXT: }
b0:
br i1 %x, label %b3, label %b1
b1: ; preds = %b0
%v2 = add i32 0, 512
br label %b3
b3: ; preds = %b1, %b0
%v4 = phi i32 [ 0, %b0 ], [ %v2, %b1 ]
%v5 = or i32 %v4, 1
%v6 = add nsw i32 %v5, -1
%v7 = getelementptr inbounds [1000000 x i16], [1000000 x i16]* @array, i32 0, i32 %v6
%v8 = getelementptr i16, i16* %v7, i32 88
%v9 = bitcast i16* %v8 to <8 x i16>*
store <8 x i16> zeroinitializer, <8 x i16>* %v9, align 8
ret void
}
attributes #0 = { norecurse nounwind }