InstCombine: Fix metadata arguments blocking freeze combining
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Sun, 4 Dec 2022 16:36:11 +0000 (11:36 -0500)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 13 Dec 2022 03:57:49 +0000 (22:57 -0500)
These are used for special arguments to intrinsics and don't make any
sense to consider for poisonness. Fixes not pushing freeze through
llvm.fptrunc.round.

92106641ae297c24877085e0357e8095aa7b43c9 made
isGuaranteedNotToBeUndefOrPoison return false for metadata arguments,
which doesn't entirely make sense. An alternate patch could switch
that to true, and try to filter out adding some pointless noundefs on
metadata arguments (I tried that, attributor breaks one case with a
llvm.dbg.value in it).

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/test/Transforms/InstCombine/freeze-fp-ops.ll

index 8a8e6e6..2e41886 100644 (file)
@@ -3801,7 +3801,8 @@ InstCombinerImpl::pushFreezeToPreventPoisonFromPropagating(FreezeInst &OrigFI) {
   // poison.
   Use *MaybePoisonOperand = nullptr;
   for (Use &U : OrigOpInst->operands()) {
-    if (isGuaranteedNotToBeUndefOrPoison(U.get()))
+    if (isa<MetadataAsValue>(U.get()) ||
+        isGuaranteedNotToBeUndefOrPoison(U.get()))
       continue;
     if (!MaybePoisonOperand)
       MaybePoisonOperand = &U;
index 4d4af05..3a45530 100644 (file)
@@ -508,9 +508,9 @@ define i1 @freeze_isfpclass(float %arg0) {
 
 define float @freeze_fptrunc_round(double %arg0) {
 ; CHECK-LABEL: @freeze_fptrunc_round(
-; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.fptrunc.round.f32.f64(double [[ARG0:%.*]], metadata !"round.downward")
-; CHECK-NEXT:    [[FREEZE:%.*]] = freeze float [[OP]]
-; CHECK-NEXT:    ret float [[FREEZE]]
+; CHECK-NEXT:    [[ARG0_FR:%.*]] = freeze double [[ARG0:%.*]]
+; CHECK-NEXT:    [[OP:%.*]] = call float @llvm.fptrunc.round.f32.f64(double [[ARG0_FR]], metadata !"round.downward")
+; CHECK-NEXT:    ret float [[OP]]
 ;
   %op = call float @llvm.fptrunc.round.f32.f64(double %arg0, metadata !"round.downward")
   %freeze = freeze float %op