zequanwu created this revision. zequanwu added reviewers: hans, craig.topper. Herald added subscribers: pengfei, hiraditya. Herald added a project: All. zequanwu requested review of this revision. Herald added projects: clang, LLVM. Herald added subscribers: llvm-commits, cfe-commits.
1. It fixes the problem that `llvm.trap()` not getting the nomerge attribute. 2. It sets nomerge flag for the node if the instruction has nomerge arrtibute. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D146164 Files: clang/lib/CodeGen/CGExpr.cpp clang/test/CodeGen/attr-nomerge.cpp llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp llvm/test/CodeGen/X86/nomerge.ll
Index: llvm/test/CodeGen/X86/nomerge.ll =================================================================== --- llvm/test/CodeGen/X86/nomerge.ll +++ llvm/test/CodeGen/X86/nomerge.ll @@ -22,6 +22,28 @@ declare dso_local void @bar() +define void @nomerge_trap(i32 %i) { +entry: + switch i32 %i, label %if.end3 [ + i32 5, label %if.then + i32 7, label %if.then2 + ] + +if.then: + tail call void @llvm.trap() #0 + br label %if.end3 + +if.then2: + tail call void @llvm.trap() #0 + br label %if.end3 + +if.end3: + tail call void @llvm.trap() #0 + ret void +} + +declare dso_local void @llvm.trap() + attributes #0 = { nomerge } ; CHECK-LABEL: foo: @@ -34,3 +56,16 @@ ; CHECK: callq bar ; CHECK: .LBB0_4: # %if.end3 ; CHECK: jmp bar # TAILCALL + +; CHECK-LABEL: nomerge_trap: +; CHECK: # %bb.0: # %entry +; CHECK: # %bb.1: # %entry +; CHECK: # %bb.2: # %if.then +; CHECK-NEXT: ud2 +; CHECK-NEXT: ud2 +; CHECK-NEXT: retq +; CHECK-NEXT: .LBB1_3: # %if.then2 +; CHECK-NEXT: ud2 +; CHECK-NEXT: .LBB1_4: # %if.end3 +; CHECK-NEXT: ud2 +; CHECK-NEXT: retq Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -6833,22 +6833,25 @@ StringRef TrapFuncName = I.getAttributes().getFnAttr("trap-func-name").getValueAsString(); if (TrapFuncName.empty()) { + SDValue Node; switch (Intrinsic) { case Intrinsic::trap: - DAG.setRoot(DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot())); + Node = DAG.getNode(ISD::TRAP, sdl, MVT::Other, getRoot()); break; case Intrinsic::debugtrap: - DAG.setRoot(DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot())); + Node = DAG.getNode(ISD::DEBUGTRAP, sdl, MVT::Other, getRoot()); break; case Intrinsic::ubsantrap: - DAG.setRoot(DAG.getNode( + Node = DAG.getNode( ISD::UBSANTRAP, sdl, MVT::Other, getRoot(), DAG.getTargetConstant( cast<ConstantInt>(I.getArgOperand(0))->getZExtValue(), sdl, - MVT::i32))); + MVT::i32)); break; default: llvm_unreachable("unknown trap intrinsic"); } + DAG.addNoMergeSiteInfo(Node.getNode(), I.hasFnAttr(Attribute::NoMerge)); + DAG.setRoot(Node); return; } TargetLowering::ArgListTy Args; Index: clang/test/CodeGen/attr-nomerge.cpp =================================================================== --- clang/test/CodeGen/attr-nomerge.cpp +++ clang/test/CodeGen/attr-nomerge.cpp @@ -40,6 +40,8 @@ A *newA = new B(); delete newA; + + [[clang::nomerge]] __builtin_trap(); } int g(int i); @@ -93,6 +95,7 @@ // CHECK: load ptr, ptr // CHECK: %[[AG:.*]] = load ptr, ptr // CHECK-NEXT: call void %[[AG]](ptr {{.*}}) #[[ATTR1]] +// CHECK: call void @llvm.trap() #[[ATTR0]] // CHECK: call void @_ZN1AD1Ev(ptr {{.*}}) #[[ATTR1]] // CHECK-DAG: attributes #[[ATTR0]] = {{{.*}}nomerge{{.*}}} Index: clang/lib/CodeGen/CGExpr.cpp =================================================================== --- clang/lib/CodeGen/CGExpr.cpp +++ clang/lib/CodeGen/CGExpr.cpp @@ -3623,7 +3623,8 @@ CGM.getCodeGenOpts().TrapFuncName); TrapCall->addFnAttr(A); } - + if (InNoMergeAttributedStmt) + TrapCall->addFnAttr(llvm::Attribute::NoMerge); return TrapCall; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits