forked from OSchip/llvm-project
[CodeGen] Don't evaluate immediate inlineasm arguments using isICE().
Instead, just EvaluateAsInt(). Follow-up to r239549: rsmith points out that isICE() is expensive; seems like it's not the right concept anyway, as it fails on `static const' in C, and will actually trigger the assert below on: test/Sema/inline-asm-validate-x86.c llvm-svn: 239651
This commit is contained in:
parent
bfb5368cc7
commit
f6a9f0e112
|
@ -1754,7 +1754,7 @@ llvm::Value* CodeGenFunction::EmitAsmInput(
|
|||
// (immediate or symbolic), try to emit it as such.
|
||||
if (!Info.allowsRegister() && !Info.allowsMemory()) {
|
||||
llvm::APSInt Result;
|
||||
if (InputExpr->isIntegerConstantExpr(Result, getContext()))
|
||||
if (InputExpr->EvaluateAsInt(Result, getContext()))
|
||||
return llvm::ConstantInt::get(getLLVMContext(), Result);
|
||||
assert(!Info.requiresImmediateConstant() &&
|
||||
"Required-immediate inlineasm arg isn't constant?");
|
||||
|
|
|
@ -20,6 +20,11 @@ void test_inlineasm_i() {
|
|||
|
||||
// CHECK-LABEL: @test_inlineasm_I
|
||||
// CHECK: call void asm sideeffect "int $0", "I{{.*}}"(i32 2)
|
||||
// CHECK: call void asm sideeffect "int $0", "I{{.*}}"(i32 3)
|
||||
void test_inlineasm_I() {
|
||||
__asm__ __volatile__("int %0" :: "I"(1 + 1));
|
||||
|
||||
// Also check a C non-ICE.
|
||||
static const int N = 1;
|
||||
__asm__ __volatile__("int %0" :: "I"(N + 2));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue