Max Kazantsev fa97f63ac6 [GuardWidening] Choose right point for generating wide condition for branches. PR60234. Take 2
There was a crash because there was inconsistency between 'isAvailableAt'
and 'makeAvailableAt' queries. 'makeAvailableAt' is called on conditions
of both guards (dominating and dominated) and 'isAvailableAt' is called
only for dominated guard's condition. Before this patch, it didn't matter
because insertion point always matched the dominating guard. Now, because
they are different, this inconsistency leads to incorrect transforms which
are caught by assert.

The fix is to check 'isAvailableAt' for both conditions.

Differential Revision: https://reviews.llvm.org/D142693
2023-01-31 20:08:52 +07:00

57 lines
2.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=guard-widening -S < %s | FileCheck %s
define ptr @test(i1 %cond, ptr %p) {
; CHECK-LABEL: @test(
; CHECK-NEXT: bb:
; CHECK-NEXT: [[VAR:%.*]] = call i1 @llvm.experimental.widenable.condition()
; CHECK-NEXT: [[VAR2:%.*]] = call i1 @llvm.experimental.widenable.condition()
; CHECK-NEXT: [[VAR3:%.*]] = and i1 [[COND:%.*]], [[VAR2]]
; CHECK-NEXT: br label [[BB4:%.*]]
; CHECK: bb4:
; CHECK-NEXT: [[VAR5:%.*]] = load atomic i32, ptr [[P:%.*]] unordered, align 8
; CHECK-NEXT: [[VAR6:%.*]] = icmp ugt i32 [[VAR5]], 0
; CHECK-NEXT: [[VAR7:%.*]] = and i1 [[VAR6]], [[VAR]]
; CHECK-NEXT: br i1 [[VAR7]], label [[BB10:%.*]], label [[BB8:%.*]]
; CHECK: bb8:
; CHECK-NEXT: [[VAR9:%.*]] = call ptr (...) @llvm.experimental.deoptimize.p0(i32 13) [ "deopt"(i32 0) ]
; CHECK-NEXT: ret ptr [[VAR9]]
; CHECK: bb10:
; CHECK-NEXT: br i1 [[VAR3]], label [[BB13:%.*]], label [[BB11:%.*]]
; CHECK: bb11:
; CHECK-NEXT: [[VAR12:%.*]] = call ptr (...) @llvm.experimental.deoptimize.p0(i32 13) [ "deopt"(i32 1) ]
; CHECK-NEXT: ret ptr [[VAR12]]
; CHECK: bb13:
; CHECK-NEXT: unreachable
;
bb:
%var = call i1 @llvm.experimental.widenable.condition()
%var2 = call i1 @llvm.experimental.widenable.condition()
%var3 = and i1 %cond, %var2
br label %bb4
bb4: ; preds = %bb
%var5 = load atomic i32, ptr %p unordered, align 8
%var6 = icmp ugt i32 %var5, 0
%var7 = and i1 %var6, %var
br i1 %var7, label %bb10, label %bb8
bb8: ; preds = %bb4
%var9 = call ptr (...) @llvm.experimental.deoptimize.p0(i32 13) [ "deopt"(i32 0) ]
ret ptr %var9
bb10: ; preds = %bb4
br i1 %var3, label %bb13, label %bb11
bb11: ; preds = %bb10
%var12 = call ptr (...) @llvm.experimental.deoptimize.p0(i32 13) [ "deopt"(i32 1) ]
ret ptr %var12
bb13: ; preds = %bb10
unreachable
}
declare ptr @llvm.experimental.deoptimize.p0(...)
declare i1 @llvm.experimental.widenable.condition()