diff --git a/llvm/lib/Target/DirectX/DXILLegalizePass.cpp b/llvm/lib/Target/DirectX/DXILLegalizePass.cpp index 395311e430fbb..b62ff4c52f70c 100644 --- a/llvm/lib/Target/DirectX/DXILLegalizePass.cpp +++ b/llvm/lib/Target/DirectX/DXILLegalizePass.cpp @@ -20,6 +20,17 @@ using namespace llvm; +static void legalizeFreeze(Instruction &I, + SmallVectorImpl &ToRemove, + DenseMap) { + auto *FI = dyn_cast(&I); + if (!FI) + return; + + FI->replaceAllUsesWith(FI->getOperand(0)); + ToRemove.push_back(FI); +} + static void fixI8TruncUseChain(Instruction &I, SmallVectorImpl &ToRemove, DenseMap &ReplacedValues) { @@ -169,6 +180,7 @@ class DXILLegalizationPipeline { void initializeLegalizationPipeline() { LegalizationPipeline.push_back(fixI8TruncUseChain); LegalizationPipeline.push_back(downcastI64toI32InsertExtractElements); + LegalizationPipeline.push_back(legalizeFreeze); } }; diff --git a/llvm/test/CodeGen/DirectX/legalize-freeze.ll b/llvm/test/CodeGen/DirectX/legalize-freeze.ll new file mode 100644 index 0000000000000..29446adeef215 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/legalize-freeze.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 + +; RUN: opt -S -passes='dxil-legalize' -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s + + +define i32 @test_remove_freeze(i32 %x) { +; CHECK-LABEL: define i32 @test_remove_freeze( +; CHECK-SAME: i32 [[X:%.*]]) { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: [[Y:%.*]] = add i32 [[X]], 1 +; CHECK-NEXT: ret i32 [[Y]] +; +entry: + %f = freeze i32 %x + %y = add i32 %f, 1 + ret i32 %y +}