Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion clang/lib/Basic/Targets/AVR.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
Int16Type = SignedInt;
Char32Type = UnsignedLong;
SigAtomicType = SignedChar;
resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8");
resetDataLayout(
"e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-n16:8-a:8");
}

void getTargetDefines(const LangOptions &Opts,
Expand Down
12 changes: 10 additions & 2 deletions llvm/lib/Target/AVR/AVRTargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "AVR.h"
#include "AVRMachineFunctionInfo.h"
#include "AVRTargetObjectFile.h"
#include "AVRTargetTransformInfo.h"
#include "MCTargetDesc/AVRMCTargetDesc.h"
#include "TargetInfo/AVRTargetInfo.h"

Expand All @@ -28,7 +29,7 @@
namespace llvm {

static const char *AVRDataLayout =
"e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8";
"e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-n16:8-a:8";

/// Processes a CPU name.
static StringRef getCPU(StringRef CPU) {
Expand Down Expand Up @@ -62,7 +63,9 @@ namespace {
class AVRPassConfig : public TargetPassConfig {
public:
AVRPassConfig(AVRTargetMachine &TM, PassManagerBase &PM)
: TargetPassConfig(TM, PM) {}
: TargetPassConfig(TM, PM) {
EnableLoopTermFold = true;
}

AVRTargetMachine &getAVRTargetMachine() const {
return getTM<AVRTargetMachine>();
Expand Down Expand Up @@ -107,6 +110,11 @@ const AVRSubtarget *AVRTargetMachine::getSubtargetImpl(const Function &) const {
return &SubTarget;
}

TargetTransformInfo
AVRTargetMachine::getTargetTransformInfo(const Function &F) const {
return TargetTransformInfo(std::make_unique<AVRTTIImpl>(this, F));
}

MachineFunctionInfo *AVRTargetMachine::createMachineFunctionInfo(
BumpPtrAllocator &Allocator, const Function &F,
const TargetSubtargetInfo *STI) const {
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/AVR/AVRTargetMachine.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ class AVRTargetMachine : public CodeGenTargetMachineImpl {
createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
const TargetSubtargetInfo *STI) const override;

TargetTransformInfo getTargetTransformInfo(const Function &F) const override;

bool isNoopAddrSpaceCast(unsigned SrcAs, unsigned DestAs) const override {
// While AVR has different address spaces, they are all represented by
// 16-bit pointers that can be freely casted between (of course, a pointer
Expand Down
56 changes: 56 additions & 0 deletions llvm/lib/Target/AVR/AVRTargetTransformInfo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//===- AVRTargetTransformInfo.h - AVR specific TTI ---------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
/// \file
/// This file defines a TargetTransformInfoImplBase conforming object specific
/// to the AVR target machine. It uses the target's detailed information to
/// provide more precise answers to certain TTI queries, while letting the
/// target independent and default TTI implementations handle the rest.
///
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_AVR_AVRTARGETTRANSFORMINFO_H
#define LLVM_LIB_TARGET_AVR_AVRTARGETTRANSFORMINFO_H

#include "AVRSubtarget.h"
#include "AVRTargetMachine.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/CodeGen/BasicTTIImpl.h"
#include "llvm/IR/Function.h"
#include <optional>

namespace llvm {

class AVRTTIImpl final : public BasicTTIImplBase<AVRTTIImpl> {
using BaseT = BasicTTIImplBase<AVRTTIImpl>;
using TTI = TargetTransformInfo;

friend BaseT;

const AVRSubtarget *ST;
const AVRTargetLowering *TLI;

const AVRSubtarget *getST() const { return ST; }
const AVRTargetLowering *getTLI() const { return TLI; }

public:
explicit AVRTTIImpl(const AVRTargetMachine *TM, const Function &F)
: BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)),
TLI(ST->getTargetLowering()) {}

bool isLSRCostLess(const TargetTransformInfo::LSRCost &C1,
const TargetTransformInfo::LSRCost &C2) const override {
if (C2.Insns == ~0u)
return true;
return 2 * C1.Insns + C1.AddRecCost + C1.SetupCost + C1.NumRegs <
2 * C2.Insns + C2.AddRecCost + C2.SetupCost + C2.NumRegs;
}
};

} // end namespace llvm

#endif // LLVM_LIB_TARGET_AVR_AVRTARGETTRANSFORMINFO_H
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/AVR/bug-143247.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@ define void @complex_sbi() {
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: push r16
; CHECK-NEXT: push r17
; CHECK-NEXT: ldi r24, 0
; CHECK-NEXT: ldi r24, 1
; CHECK-NEXT: ldi r25, 0
; CHECK-NEXT: .LBB0_1: ; %while.cond
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT: sbi 1, 7
; CHECK-NEXT: adiw r24, 1
; CHECK-NEXT: movw r16, r24
; CHECK-NEXT: andi r24, 15
; CHECK-NEXT: andi r25, 0
; CHECK-NEXT: adiw r24, 1
; CHECK-NEXT: call nil
; CHECK-NEXT: movw r24, r16
; CHECK-NEXT: adiw r24, 1
; CHECK-NEXT: rjmp .LBB0_1
entry:
br label %while.cond
Expand Down
30 changes: 26 additions & 4 deletions llvm/test/CodeGen/AVR/load.ll
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; RUN: llc -mattr=avr6,sram < %s -mtriple=avr -verify-machineinstrs | FileCheck %s
; RUN: llc -mattr=avr6,sram < %s -mtriple=avr-none -verify-machineinstrs | FileCheck %s

define i8 @load8(ptr %x) {
; CHECK-LABEL: load8:
Expand Down Expand Up @@ -98,9 +98,31 @@ while.end: ; preds = %while.body, %entry
ret i16 %r.0.lcssa
}

define i16 @load16postincloopreduce(ptr %p, i16 %cnt) {
; CHECK-LABEL: load16postincloopreduce:
; CHECK: ld {{.*}}, {{[XYZ]}}+
; CHECK: ld {{.*}}, {{[XYZ]}}+
entry:
%cmp3 = icmp sgt i16 %cnt, 0
br i1 %cmp3, label %for.body, label %for.cond.cleanup
for.cond.cleanup: ; preds = %for.body, %entry
%sum.0.lcssa = phi i16 [ 0, %entry ], [ %add, %for.body ]
ret i16 %sum.0.lcssa
for.body: ; preds = %entry, %for.body
%i.06 = phi i16 [ %inc, %for.body ], [ 0, %entry ]
%sum.05 = phi i16 [ %add, %for.body ], [ 0, %entry ]
%p.addr.04 = phi ptr [ %incdec.ptr, %for.body ], [ %p, %entry ]
%incdec.ptr = getelementptr inbounds nuw i8, ptr %p.addr.04, i16 2
%0 = load i16, ptr %p.addr.04, align 1
%add = add nsw i16 %0, %sum.05
%inc = add nuw nsw i16 %i.06, 1
%exitcond.not = icmp eq i16 %inc, %cnt
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}

define i8 @load8predec(ptr %x, i8 %y) {
; CHECK-LABEL: load8predec:
; CHECK: ld {{.*}}, -{{[XYZ]}}
; TODO: ld {{.*}}, -{{[XYZ]}}
entry:
%tobool6 = icmp eq i8 %y, 0
br i1 %tobool6, label %while.end, label %while.body
Expand All @@ -121,8 +143,8 @@ while.end: ; preds = %while.body, %entry

define i16 @load16predec(ptr %x, i16 %y) {
; CHECK-LABEL: load16predec:
; CHECK: ld {{.*}}, -{{[XYZ]}}
; CHECK: ld {{.*}}, -{{[XYZ]}}
; TODO: ld {{.*}}, -{{[XYZ]}}
; TODO: ld {{.*}}, -{{[XYZ]}}
entry:
%tobool2 = icmp eq i16 %y, 0
br i1 %tobool2, label %while.end, label %while.body
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/AVR/shift.ll
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=avr -mtriple=avr -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=avr-none -verify-machineinstrs | FileCheck %s

; Optimize for speed.
define i8 @shift_i8_i8_speed(i8 %a, i8 %b) {
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/CodeGen/AVR/store.ll
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ while.end: ; preds = %while.body, %entry

define void @store8predec(ptr %x, i8 %y) {
; CHECK-LABEL: store8predec:
; CHECK: st -{{[XYZ]}}, {{.*}}
; TODO: st -{{[XYZ]}}, {{.*}}
entry:
%tobool3 = icmp eq i8 %y, 0
br i1 %tobool3, label %while.end, label %while.body
Expand All @@ -112,8 +112,8 @@ while.end: ; preds = %while.body, %entry

define void @store16predec(ptr %x, i16 %y) {
; CHECK-LABEL: store16predec:
; CHECK: st -{{[XYZ]}}, {{.*}}
; CHECK: st -{{[XYZ]}}, {{.*}}
; TODO: st -{{[XYZ]}}, {{.*}}
; TODO: st -{{[XYZ]}}, {{.*}}
entry:
%tobool3 = icmp eq i16 %y, 0
br i1 %tobool3, label %while.end, label %while.body
Expand Down