From a550fda1e69c6f45ef4f5af4f3387a91716db072 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson Date: Fri, 23 Jun 2017 14:30:46 +0000 Subject: [PATCH] [SystemZ] Fix trap issue and enable expensive checks. The isBarrier/isTerminator flags have been removed from the SystemZ trap instructions, so that tests do not fail with EXPENSIVE_CHECKS. This was just an issue at -O0 and did not affect code output on benchmarks. (Like Eli pointed out: "targets are split over whether they consider their "trap" a terminator; x86, AArch64, and NVPTX don't, but ARM, MIPS, PPC, and SystemZ do. We should probably try to be consistent here.". This is still the case, although SystemZ has switched sides). SystemZ now returns true in isMachineVerifierClean() :-) These Generic tests have been modified so that they can be run with or without EXPENSIVE_CHECKS: CodeGen/Generic/llc-start-stop.ll and CodeGen/Generic/print-machineinstrs.ll Review: Ulrich Weigand, Simon Pilgrim, Eli Friedman https://bugs.llvm.org/show_bug.cgi?id=33047 https://reviews.llvm.org/D34143 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306106 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SystemZ/SystemZInstrInfo.td | 9 +++---- lib/Target/SystemZ/SystemZTargetMachine.h | 2 -- test/CodeGen/Generic/llc-start-stop.ll | 5 +++- test/CodeGen/Generic/print-machineinstrs.ll | 27 +++++++++++++++------ test/CodeGen/SystemZ/trap-02.ll | 4 +-- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/lib/Target/SystemZ/SystemZInstrInfo.td b/lib/Target/SystemZ/SystemZInstrInfo.td index fa5ecdd85243..fdfa3f891df5 100644 --- a/lib/Target/SystemZ/SystemZInstrInfo.td +++ b/lib/Target/SystemZ/SystemZInstrInfo.td @@ -189,18 +189,15 @@ let isBranch = 1, isTerminator = 1 in { //===----------------------------------------------------------------------===// // Unconditional trap. -// FIXME: This trap instruction should be marked as isTerminator, but there is -// currently a general bug that allows non-terminators to be placed between -// terminators. Temporarily leave this unmarked until the bug is fixed. -let isBarrier = 1, hasCtrlDep = 1 in +let hasCtrlDep = 1 in def Trap : Alias<4, (outs), (ins), [(trap)]>; // Conditional trap. -let isTerminator = 1, hasCtrlDep = 1, Uses = [CC] in +let hasCtrlDep = 1, Uses = [CC] in def CondTrap : Alias<4, (outs), (ins cond4:$valid, cond4:$R1), []>; // Fused compare-and-trap instructions. -let isTerminator = 1, hasCtrlDep = 1 in { +let hasCtrlDep = 1 in { // These patterns work the same way as for compare-and-branch. defm CRT : CmpBranchRRFcPair<"crt", 0xB972, GR32>; defm CGRT : CmpBranchRRFcPair<"cgrt", 0xB960, GR64>; diff --git a/lib/Target/SystemZ/SystemZTargetMachine.h b/lib/Target/SystemZ/SystemZTargetMachine.h index eb2f17a2091c..a10ca64fa632 100644 --- a/lib/Target/SystemZ/SystemZTargetMachine.h +++ b/lib/Target/SystemZ/SystemZTargetMachine.h @@ -51,8 +51,6 @@ class SystemZTargetMachine : public LLVMTargetMachine { } bool targetSchedulesPostRAScheduling() const override { return true; }; - - bool isMachineVerifierClean() const override { return false; } }; } // end namespace llvm diff --git a/test/CodeGen/Generic/llc-start-stop.ll b/test/CodeGen/Generic/llc-start-stop.ll index 49407fbb2d88..becd1cc453c7 100644 --- a/test/CodeGen/Generic/llc-start-stop.ll +++ b/test/CodeGen/Generic/llc-start-stop.ll @@ -1,7 +1,10 @@ -; RUN: llc < %s -debug-pass=Structure -stop-after=loop-reduce -o /dev/null 2>&1 | FileCheck %s -check-prefix=STOP-AFTER +; Note: -verify-machineinstrs is used in order to make this test compatible with EXPENSIVE_CHECKS. +; RUN: llc < %s -debug-pass=Structure -stop-after=loop-reduce -verify-machineinstrs -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=STOP-AFTER ; STOP-AFTER: -loop-reduce ; STOP-AFTER: Dominator Tree Construction ; STOP-AFTER: Loop Strength Reduction +; STOP-AFTER-NEXT: Verify generated machine code ; STOP-AFTER-NEXT: MIR Printing Pass ; RUN: llc < %s -debug-pass=Structure -stop-before=loop-reduce -o /dev/null 2>&1 | FileCheck %s -check-prefix=STOP-BEFORE diff --git a/test/CodeGen/Generic/print-machineinstrs.ll b/test/CodeGen/Generic/print-machineinstrs.ll index 26bccaae572c..b33e0929edc8 100644 --- a/test/CodeGen/Generic/print-machineinstrs.ll +++ b/test/CodeGen/Generic/print-machineinstrs.ll @@ -1,12 +1,25 @@ -; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs=branch-folder -o /dev/null 2>&1 | FileCheck %s -; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs -o /dev/null 2>&1 | FileCheck %s -; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs= -o /dev/null 2>&1 | FileCheck %s +; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs=branch-folder -verify-machineinstrs -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=PRINT-BRANCH-FOLD +; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs -verify-machineinstrs -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=PRINT +; RUN: llc < %s -O3 -debug-pass=Structure -print-machineinstrs= -verify-machineinstrs -o /dev/null 2>&1 \ +; RUN: | FileCheck %s -check-prefix=PRINT + +; Note: -verify-machineinstrs is used in order to make this test compatible with EXPENSIVE_CHECKS. define i64 @foo(i64 %a, i64 %b) nounwind { -; CHECK: -branch-folder -machineinstr-printer -; CHECK: Control Flow Optimizer -; CHECK-NEXT: MachineFunction Printer -; CHECK: Machine code for function foo: +; PRINT-BRANCH-FOLD: -branch-folder -machineverifier -machineinstr-printer +; PRINT-BRANCH-FOLD: Control Flow Optimizer +; PRINT-BRANCH-FOLD-NEXT: Verify generated machine code +; PRINT-BRANCH-FOLD-NEXT: MachineFunction Printer +; PRINT-BRANCH-FOLD: Machine code for function foo: + +; PRINT: -branch-folder -machineinstr-printer +; PRINT: Control Flow Optimizer +; PRINT-NEXT: MachineFunction Printer +; PRINT-NEXT: Verify generated machine code +; PRINT: Machine code for function foo: + %c = add i64 %a, %b %d = trunc i64 %c to i32 %e = zext i32 %d to i64 diff --git a/test/CodeGen/SystemZ/trap-02.ll b/test/CodeGen/SystemZ/trap-02.ll index 5fdb87c292d7..fed419f373ec 100644 --- a/test/CodeGen/SystemZ/trap-02.ll +++ b/test/CodeGen/SystemZ/trap-02.ll @@ -47,9 +47,9 @@ if.end: ; preds = %entry define i32 @f3(i32 zeroext %a, i32 *%base, i64 %offset) { ; CHECK-LABEL: f3: ; CHECK: cl %r2, 0(%r{{[0-5]}},%r3) +; CHECK: lhi %r2, 0 ; CHECK-LABEL: .Ltmp0 ; CHECK: jh .Ltmp0+2 -; CHECK: lhi %r2, 0 ; CHECK: br %r14 entry: %ptr = getelementptr i32, i32 *%base, i64 %offset @@ -70,9 +70,9 @@ if.end: ; preds = %entry define i64 @f4(i64 %a, i64 *%base, i64 %offset) { ; CHECK-LABEL: f4: ; CHECK: clg %r2, 0(%r{{[0-5]}},%r3) +; CHECK: lghi %r2, 0 ; CHECK-LABEL: .Ltmp1 ; CHECK: jh .Ltmp1+2 -; CHECK: lghi %r2, 0 ; CHECK: br %r14 entry: %ptr = getelementptr i64, i64 *%base, i64 %offset